java中Exception和Error的区别

2018-12-14  本文已影响0人  温驭臣

        世界上有永远不出错的程序吗?没有。所以我们需要异常机制,java在设计之初就提供了完善的异常处理机制,这也是java能大行其道的原因。为了学习java的Exception和Error异常机制我们试着问两个问题,1,对比Exception和Error。2,运行异常和一般异常的区别

一,对比Exception和Error

        1,相同点:Exception和Error都是继承了Throwable类,在java中只有Throwable类型的实例才可以被抛出,它是异常处理机制的基本组成部分。

        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这个错误。

上一篇 下一篇

猜你喜欢

热点阅读