异常机制
Java的异常机制主要依赖于try,catch,finally,throw,throws五个关键字,可以让程序具有极好的健壮性。
1,try catch捕获异常
try{
//业务实现代码
}
catch (Exception e){
System.out.println("输入不合法");
goto retry
}
如果业务代码块出现异常,系统会生成一个异常对象,这个过程称为抛出异常。
2,异常类的继承机制
每个catch块都是专门用于处理该异常类及其子类的异常实例。
try块后面可以有多个catch块,java运行时可以根据该异常对象所属的异常类来决定使用哪个catch块来处理该异常。
JAVA把所有非正常情况分为两种:异常(Exception)和错误(Error),它们都继承Throwable父类。
Error:一般是与虚拟机相关的问题,如系统崩溃,虚拟机错误,动态链接失败等。这种错误无法恢复或不可能捕获。
Exception:`
try {
Date d = null;
//业务实现代码
System.out.println(d.after(new java.util.Date()));
} catch (NullPointerException ne) {
System.out.println("空指针异常");
} catch (Exception e) {
System.out.println("未知异常");
}
可以看到Exception类的catch块应当放在最后,也就是先处理小异常,再处理大异常
3,JAVA7新增的多异常捕获
注意:
捕获多种类型的异常时,多种异常类型之间用竖线(|)隔开。
捕获多种类型的异常时,异常变量默认有隐式的final修饰,因此程序不能对异常变量重新赋值。
4,访问异常信息
getMessage():返回该异常描述的详细字符串
printStackTrace():将该异常的跟踪栈信息输出到标准错误输出
printStackTrace(PrintStream s):将该异常的跟踪栈信息输出到指定输出流
getStackTrace():返回该异常的跟踪栈信息
5,使用finally回收资源
对数据库连接,网络连接,磁盘文件等物理资源进行回收。
try{
//业务实现代码
}
catch (Exception e){
//异常代码块
}
catch (Exception e){
//异常代码块
}
finally{
//资源回收块
}
1,如果在异常处理代码中使用System.exit(1)语句来退出虚拟机,则finally块将失去执行的机会。
2,尽量避免使用return或throw等导致方法终止的语句,否则可能会出现一些奇怪的情况
6,Java9增强的自动关闭资源的try语句
try(
//声明,初始化两个可关闭的资源
//try语句会自动关闭这两个资源
BufferedReader br= new BufferedReader(new FileReader("AutoCloseTest.java"))
)
这种try语句相当于包含了隐式的finally块
异常体系
Java的异常被分为两大类:Checked异常和Runtime异常(运行时异常)
Java程序必须显式处理Checked异常。
1,使用throws声明抛出异常
当不知道如何处理这种类型的异常时,该异常应该由上一级调用这处理
throws ExceptionClass1 , ExceptionClass2...
一旦使用throws语句,就无需再使用try…catch块来捕获该异常
方法重写时,子类抛出的异常应该是父类抛出异常类型的子类或相同
2,使用throw抛出异常
如果需要自行抛出异常,则应使用throw语句
throw ExceptionInstance;
当Java运行时接收到自行抛出的异常后,同样会中止执行流,跳到catch里进行处理。
3,自定义异常类
下面是自定义异常类的一个例子
public class MyException extends Exception {
//无参构造器
public MyException(){}
//有参构造器
public MyException(String Msg){
super(Msg);
}
}
4,catch和throw同时使用
当一个异常出现时,单靠某个方法无法完全处理该异常,必须由几个方法协作才可以完全处理该异常。也就是说,在异常出现的当前方法中,程序只对异常进行部分处理,还有些处理需要在该方法的调用者中才能完成。
5,异常链
程序先捕获原始异常,然后抛出一个新的业务异常,新的业务异常包含了对用户的提示信息,这种处理方式被称为异常转译。
这种把捕获一个异常然后接着抛出另一个异常,并把原始异常信息保存下来是一种典型的链式处理,称为“异常链”。
23种设计模式之一:职责链模式
异常处理的规则和总结
1,不要过度使用异常
2,不要使用过于庞大的try块
3,不要忽略捕获到的异常