世界上有永远不出错的程序吗?没有。所以我们需要异常机制,java在设计之初就提供了完善的异常处理机制,这也是java能大行其道的原因。为了学习java的Exception和Error异常机制我们试着问两个问题,1,对比Exception和Error。2,运行异常和一般异常的区别
一,对比Exception和Error
1,相同点:Exception和Error都是继承了Throwable类,在java中只有Throwable类型的实例才可以被抛出,它是异常处理机制的基本组成部分。
![](https://img.haomeiwen.com/i14993831/3dd55cb12a79dadb.png)
2,不同点:Exception和Error是java设计者对不同异常情况的分类。Exception是程序正常运行中可以预料并且应该被捕获,进行相应处理。Error是正常情况下不大可能出现的情况,绝大部分Error会导致程序处于非正常状态,不可恢复,也不方便和不需要捕获,常见的比如OutOfMemoryError之类,都是Error的子类。
Exception又分为可检查(checked)和不可检查(unchecked)异常,可检查是在代码里显示的进行捕获处理,不可检查是只有程序运行时才会抛出比如常见的NullPointerException
二,知识扩展
1,尽量不要捕获类似Exception这样的通用异常,而应该捕获特定异常。不要推诿或延迟处理异常,就地解决最好,并且需要实实在在的进行处理,而不是只捕获,不动作。比如RuntimeException需要扩散出来,而不是被捕获。
2,不要生吞(swallow)异常。一个函数尽管抛出了多个异常,但是只有一个异常可被传播到调用端。最后被抛出的异常时唯一被调用端接收的异常,其他异常都会被吞没掩盖。如果调用端要知道造成失败的最初原因,程序之中就绝不能掩盖任何异常。
3,不要在finally代码块中处理返回值。
4,按照我们程序员的惯性认知:当遇到return语句的时候,执行函数会立刻返回。但是,在Java语言中,如果存在finally就会有例外。除了return语句,try代码块中的break或continue语句也可能使控制权进入finally代码块。
5,请勿在try代码块中调用return、break或continue语句。万一无法避免,一定要确保finally的存在不会改变函数的返回值。
6,函数返回值有两种类型:值类型与对象引用。对于对象引用,要特别小心,如果在finally代码块中对函数返回的对象成员属性进行了修改,即使不在finally块中显式调用return语句,这个修改也会作用于返回值上。
7,勿将异常用于控制流。
8,如无必要,勿用异常。
三,NoClassDefFoundError和ClassNotFoundException有什么区别?
ClassNotFoundException是在写编码的时候编译器就能告诉你这个地方需要捕获异常,如:你使用Class.forName的时候就必须要你捕获或者throws这个异常。
NoClassDefFoundError在Javac已经把程序成功的编译成字节码文件了,当JVM进程启动,通过类加载器加载字节码文件,然后由JIT(Just In Time,运行时需要代码时,将字节码转换为机器码的编译)去编译字节码指令的时候,在classpath下找不到对应的类进行加载时就会发生NoClassDefFoundError这个错误。
网友评论