1、java异常标准
在java中,Throwable这个类是所有异常或错误的父类。Throwable可以分为两种类型:
error:表示编译时和系统错误,除特殊情况外,一般不用担心
exception:可以被抛出的类型,在java类库、用户方法以及运行时故障中都可能抛出Exception异常。
RuntimeException:通过名字可以知道是程序运行过程中出现的异常。属于运行时异常的类型有很多,它们会自动被java虚拟机抛出,并且这些异常都继承了RuntimeException。通过继承RuntimeException,使它们构成了一组具有相同特征和行为的异常类型。并且也不再需要在异常说明中声明方法将抛出RuntimeException类型的异常(或者任何从RuntimeException继承的异常),这些异常被称为"不受检查异常"。
2、使用finally进行清理
对于一些代码,可能会希望无论try块中的异常是否抛出,它们都能得到执行。这通常适用于内存回收之外的情况(因为内存回收由垃圾回收器完成),为了达到这个效果,可以在异常处理程序后面加上finally子句。finally非常重要,它能使程序员保证:无论try块里发生了什么,内存总能得到释放。当要把除内存之外的资源恢复到它们的初始状态时,就要用到finally子句。
下面我们来看一些使用finally的例子
1 public class TestException2 {
2 public static void main(String[] args) {
3 System.out.println(f(1));
4 }
5 public static int f(int i){
6 try{
7 if(i == 1) {
8 throw new FourException();
9 }
10 }catch (FourException e){
11 System.out.println("four");
12 }finally {
13 System.out.println("finally");
14 }
15 return i;
16 }
17 }
18 class FourException extends Exception{}
通过上面代码我们可以看出虽然在try块里面抛出了异常,但是finally中的代码还是得到了执行。
1 public class TestFinally {
2 public static void main(String[] args) {
3 int value = returnNumber();
4 System.out.println(value);
5 }
6
7 public static int returnNumber(){
8 try{
9 System.out.println("try 内容");
10 return 3;
11 }catch (Exception e){
12 e.printStackTrace();
13 }finally {
14 System.out.println("finally");
15 return 2;
16 }
17 }
18 }
使用finally虽然可以清理一些不用的资源,但是千万不能在finally中执行return,如果执行return的话,最后的结果可能和我们想要得到的结果会大不一样
3、总结
我们应该在以下情况下使用异常
(1)、在恰当的级别处理问题(在知道该如何处理的情况下才捕获异常)
(2)、解决问题并且重新调用产生异常的方法
(3)、进行少许修补,然后绕过异常发生的地方继续执行
(4)、用别的数据进行计算,以代替方法预计会返回的值
(5)、把当前运行环境下能做的事尽量做完,然后把相同的异常抛到更高层
(6)、把当前运行环境下能做的事尽量做完,然后把不同的异常抛到更高层
(7)、终止程序
(8)、进行简化(如果你的异常模式使问题变得太复杂,那用起来会非常痛苦也很烦人)
(9)、让类库和程序更安全(既是为调试做短期投资,也是在为程序的健壮性做长期投资)
异常是java程序设计不可分割的一部分,异常处理的优点之一就是使得你可以在某处集中精力处理你要解决的问题,而在另一处处理你编写的这段代码中产生的错误。