Java核心技术36讲 第二讲:Exception和Error

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jal517486222/article/details/82806387

对比Exception和Error

  1. Exception和Error都是继承自Throwable类。
    Exception是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。
    Error是指在正常情况下,不大可能出现的情况,绝大部分的Error都会导致程序(比如JVM自身)处于非正常情况,所以不便于也不需要捕获,常见的比如OutOfMemoryError之类都是Error的子类。

  2. Exception又分为可检查(checked)异常和不检查(unchecked)异常,可检查异常必须在源代码里显示捕获处理,不检查异常就是所谓的运行时异常, 类似NullPointerException、ArrayIndexOutOfBoundsException之类,通常可以编码避免逻辑错误,可以根据需要判断是否去捕获,并不会在编译时强制要求。

  3. 尽量不要捕获类似Exception这样的通用异常,而是应该捕获特定异常

  4. 不要生吞(swallow)异常。往往是基于假设这段代码是不可能会发生,或者感觉忽略异常是无所谓的。

  5. try-catch代码段会产生额外的性能开销,建议仅捕获有必要的代码段,尽量不要一个大的try包住整段代码。try-catch不如if-else高效。
    Java每实例化一个Exception,都会对当时的栈进行快照,这是个相当重的操作,性能开销大。

Throwable

  • Error
    • LinkageError
    • NoClassDefFoundError *
    • UnsatisfiedLinkError
    • ExceptionInInitializerError
    • VirtualMachineError
    • OutOfMemoryError
    • StackOverflowError
  • Exception
    • IOException
      (Checked Exception)
    • NullPointerException
    • ClassCastException
    • SecurityException
    • ClassNotFoundException *

ClassNotFoundException 和 NoClassDefFoundError 区别

ClassNotFoundException;
当应用程序试图通过类的字符串名称,使用以下三种方法装入类,但却找不到指定名称的类定义时抛出该异常,是显式类装载的抛出的异常。
1.类 Class 中的 forName() 方法。
2.类 ClassLoader 中的 findSystemClass() 方法。
3.类 ClassLoader 中的 loadClass() 方法。

NoClassDefFoundError:
如果 Java 虚拟机或 ClassLoader 实例试图装入类定义(作为正常的方法调用的一部分,或者作为使用 new 表达式创建新实例的一部分),但却没有找到类定义时抛出该异常。
当目前执行的类已经编译,但是找不到它的定义时,会存在 searched-for 类定义。
实际上,这意味着 NoClassDefFoundError 的抛出,是不成功的隐式类装入的结果。
简单说来,就是引用的类在类路径中没有找到。

猜你喜欢

转载自blog.csdn.net/jal517486222/article/details/82806387