在这个世界不可能存在完美的东西,不管完美的思维有多么缜密,细心,我们都不可能考虑所有的因素,这就是所谓的智者千虑必有一失。同样的道理,计算机的世界也是不完美的,异常情况随时都会发生,我们所需要做的就是避免那些能够避免的异常,处理那些不能避免的异常。这里我将记录如何利用异常还程序一个“完美世界”。
异常处理最根本的优势就是将检测错误(由被调用的方法完成)从处理错误(由调用方法完成)中分离出来。(也就是没有那么多if语句了)
以调用method()方法为例
public class ExceptionDemo { public static void main(String[] args) { //捕获一个异常 try { method(); }catch(Exception ex){ //做一些异常的处理 } } public static void method() throws Exception{ //throws声明异常 int a = 1; if(a==0) { throw new Exception(); //抛出一个异常对象 } } }声明异常
1、每个方法都必须用throws声明它可能抛出的必检异常,免检异常不要求显式声明(必检异常和免检异常在下一节有说明)
2、throws后又多个异常时用逗号分隔异常列表
3、如果方法没有在父类中声明异常,那么久不能在父类中对其进行继承来声明异常。抛出异常
1、抛出的其实是一个异常类的对象 throw new Exception();
2、java API异常类至少有两个构造方法:一个无参构造方法和一个可描述这个异常的String参数的构造方法(它可用getMassage()获取)。
捕获异常
异常处理器:处理一个异常的代码
捕获一个异常即从当前方法开始,沿着方法调用链,按异常的反向传播方向找到一个可以处理该异常的异常处理器。
问:对那些该异常处理却没有异常处理的部分,java怎么处理
答:如果在调用的方法链中找不到处理器,程序就会终止并且在控制台上打印
需要注意的是:
①一个通用的父类可以派生出各种异常类,而父类可以捕获子类的异常(但不建议,尽量特事特办)
②父类的catch块必须在其子类catch块后面
③如果方法声明了一个必检异常,就必须在try-catch块中调用它,或者再调用方法中声明要抛出异常,而后再次抛出给其他方法去处理
获取异常信息
java.lang.Throwable类中有以下实例方法可以获取有关异常的信息。
+getMessage():String (返回描述该异常对象的信息)
+toString():String (返回三个字符的连接:1)异常类的全名;2)“:”(一个冒号和空白)3)getMessage(方法))
+getStackTrace():StackTraceElement [ ] 在控制台打印Throwable对象和它的调用堆栈信息。返回和该异常对象相关的代表堆栈跟踪的一个堆栈跟踪元素的信息
异常类可以三种主要类型:①系统错误(Error) ②运行时异常 (RuntimeException)③异常(Exception)
而系统错误和运行时异常及它们的子类都称为免检异常,其他异常都为必检异常。
无论异常是否产生,finally子句总是会被执行的。
=======================================分隔线===================================================后面还有 何时使用异常、重新抛出异常、链式异常、创建自定义异常四部分内容将会更新