异常处理(exception handling):负责处理组件缺陷(可预期的错误状况)。
容错设计(fault-tolerant programming):负责处理设计缺陷(不可预期的错误状况)。
由于程序语言主只提供了异常处理机制,并没有特别帮容错设计安排额外的机制,因此无论是上述分类中的异常处理或容错编程,在实现层面都可以采用程序语言的异常处理机制。
缺陷避免 fault prevention
缺陷容忍 fault tolerance :当检测到缺陷时,切换到备份路径上。
缺陷移除 fault removal (tip: remove n. 距离;差距;间距,****注意并没有去除的意思)
缺陷预测 fault forcasting
关于Java中的异常类
所有“异常”类的顶层类是Throwable,
-Throwable
--Exception
--IOException
--SQLException
--RuntimeException
--NullPointerException
--IndexOutofBoundsException
--Error
上面红色加亮的部分表示的是未查异常,又称运行时异常。而Exception下面,不属于RuntimeException的异常类型则为检查型异常。
在某些特殊情况下,如果要连错误都一起捕获,则可以用catch(Throwable e)的方式。
************************Java中try catch finally 语句块的一些问题*********
finally :try…… catch ……finally语句块中最后的finally 块是用来释放在try块里面所使用的资源的,不管try块中是否发生异常,只要写了finally 块,程序的执行顺序最后一定会跑到这里面。tip:就算是直接在try 或是catch里面使用return 指令,finally 块也还是会被执行(tips:因为finally 虽然位置在return 后面,但是java虚拟机处理时,finally语句是在return语句之前执行的。具体见本文末尾所附文章)。但是请注意,只有与 finally 相对应的 try 语句块得到执行的情况下,finally 语句块才会执行。
世上无绝对,是规则就会有异常。当JVM执行到try块或是catch块里面的代码时,但是JVM自己本身却被终止执行时,finally 块便不会被执行。
如下面的例子所示:
public static void main(String[] args){
try{
System.out.println(“execute try block”);
System.exit(0);
}
finally{
System.out.println(“execute finally block”);
}
} //因为在try语句块中直接调用System.exit(0)终止了整个程序的执行,所以finally块不会被执行。
******************************************
到了Java SE7之后,多了几个新的功能,先来看看第一个新功能multi-catch exceptions,它可以在一个catch块里面同时捕获多个异常,如下面所示:
try{
}catch(ParseException | IOException e){
}
第二个新功能try-with-resources是Java从C#那里借用的,在JAVA SE7之前,释放资源的程序要写在finally 块里。但SE7之后,可以把产生资源的程序代码写在try语句块中,在离开整个try语句块之前,JVM会自动调用相应对象的close函数进行清理。 tips:如果想要应用这个新的功能,即让try语句块后自动清理资源,就必须让该类实现AutoCloseable这个Java SE7之后才新增的接口。该接口很简单,只有一个函数:
void close() throws Exception
注:第二个功能不建议使用。
第三个功能即重丢异常(rethrow)的改变。
在SE7之前,一个IOException被catch(Exception e)捕获后重新以Exception e抛出,编译程序会认为被捕获到的异常属于Exception.既然要把它往外丢,就应该在这个函数接口上声明throws Exception而非IOExcetion.
到了SE7之后,编译程序就变得聪明了,已经会自动判断catch(Exception e)所捕获到的异常类型,其实是try块里面丢出来的IOException,这样程序就可以编译通过了。
总结
没想到吧!一个小小的、看似简单的 finally 语句块背后居然隐藏了这么多玄机。看来,我们平时还是应该认真的阅读 Java 相关的基础文档,比如:Java 语言规范、Java 虚拟机规范等,很多棘手的问题都可以从中得到答案。只有真正的吃透了基础知识,才能达到运用自如的境界!
关于 Java 中 finally 语句块的深度辨析 (其实关于finally语句块的水很深,下面的这个IBM的链接很能说明问题。
http://www.ibm.com/developerworks/cn/java/j-lo-finally/
没有 catch 语句,哪来的异常处理呢?我觉得这是一个好问题,其实,即使没有 catch 语句,Java 编译器编译出的字节码中还是有默认的异常处理的,别忘了,除了需要捕获的异常,还可能有不需捕获的异常(如:RunTimeException 和 Error)。
凡是java的问题,最后都从官方的参考文档中找寻答案。 或者通过分析编译后的字节码来查找问题。