异常体系
1. error/Exception
2. 运行时异常和非运行异常
异常使用
1. 运用Java异常处理机制
(1)try...catch语句
(2)finally语句:任何情况下都必须执行的代码
(3)throws子句:声明可能会出现的异常
(4)throw语句:抛出异常
2. 异常处理的原则
(1)Java虚拟机用方法调用栈(method invocation stack)来跟踪每个线程中一系列的方法调用过程
(2)如果在执行方法的过程中抛出异常,则Java虚拟机必须找到能捕获该异常的catch代码块
(3)当Java虚拟机追溯到调用栈的底部的方法时,如果仍然没有找到处理该异常的代码块,则打印该异常,如不是主线程则终止该线程。
3. 异常流程的运行过程
(1)finally语句不被执行的唯一情况就是先执行了用于终止程序的System.exit()方法。
(2)Return语句用于退出本方法时,finally语句仍会执行
(3)finally代码块虽然在return语句之前就被执行,但它的变量修改不会影响返回值
(4)建议不要在finally代码块中使用return语句,一是会覆盖try...catch语句中的return语句,二是会丢失异常
一些异常的面试题
1. Java中的检查型异常和非检查型异常有什么区别?
(1)继承自runtimeexception或error的是非检查型异常,而继承自exception的则是检查型异常(当然,runtimeexception本身也是exception的子类)。
(2)对非检查型类异常可以不用捕获,而检查型异常则必须用try语句块进行处理或者把异常交给上级方法处理总之就是必须写代码处理它。
2. throw和throws这两个关键字在java中有什么不同?
throw 和 throws乍看起来是很相似的尤其是在你还是一个java初学者的时候。尽管他们看起来相似,都是在处理异常时候使用到的。但在代码里的使用方法和用到的地方是不同的。throws总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常, 你也可以申明未检查的异常,但这不是编译器强制的。如果方法抛出了异常那么调用这个方法的时候就需要将这个异常处理。另一个关键字 throw 是用来抛出任意异常的,按照语法你可以抛出任意 Throwable (i.e. Throwable 或任何Throwable的衍生类) , throw可以中断程序运行,因此可以用来代替return . 最常见的例子是用 throw 在一个空方法中需要return的地方抛出 UnSupportedOperationException 代码如下 :
private static void show() { throw new UnsupportedOperationException("Not yet implemented"); }
3. 如果执行finally代码块之前方法返回了结果,或者JVM退出了,finally块中的代码还会执行吗?
这个问题也可以换个方式问:“如果在try或者finally的代码块中调用了System.exit(),结果会是怎样”。了解finally块是怎么执行的,即使是try里面已经使用了return返回结果的情况,对了解Java的异常处理都非常有价值。只有在try里面是有System.exit(0)来退出JVM的情况下finally块中的代码才不会执行。
4.Java中final,finalize,finally关键字的区别
final和finally是Java的关键字,而finalize则是方法。final关键字在创建不可变的类的时候非常有用,只是声明这个类是final的。而finalize()方法则是垃圾回收器在回收一个对象前调用,但也Java规范里面没有保证这个方法一定会被调用。finally关键字是唯一一个和这篇文章讨论到的异常处理相关的关键字。在你的产品代码中,在关闭连接和资源文件的是时候都必须要用到finally块。