Throwable、Exception、Error

641 阅读1分钟

Throwable是Exception和Error的父类,Java中只有Throwable类型的实例才可以被抛出(throw)或者捕获(catch)。

Error指在正常情况下,不太可能出现的意外情况,并让程序(比如JVM自身)处于非正常、不可恢复的状态。所以不应该也不需要被捕获,比如OutOfMemoryError。

Exception是程序正常运行中,可以预料到的意外情况,可能并且应该被捕获,并进行相应的处理。

Java语言使用try-catch-finally来处理异常,常在finally里做一些资源回收工作。随着Java语言的发展,引入例如如multiple catch和try-with-resoures等更便利的方式。

以下代码就自动按照约定close掉哪些扩展了AutoCloseable或者Closeable的对象。

try(BufferedReader br = new BufferedReader(...);
    BufferedWriter bw = new BufferedWriter(...)){
        // do something
}catch(IOException | Exception e){
    // Handle it
}

Java每实例一个Exception都会对当时的栈进行快照,这是一个相对较中的操作。所以try应仅包含必要的代码段。

面试常问问题:

NoClassDefFoundError和ClassNotFoundException的区别

ClassNotFoundException: Java编译期报错,原因:写错类名。 Java运行期使用Class.forName方法动态加载类时报错,原因:这个类在类路径中没有找到。

NotClassDefFoundError: 运行期JVM后者ClassLoader实例尝试加载类(如使用new创建实例)却找不到类定义,而编译时候是存在的。原因:打包过程漏掉了部分类,或者jar包出现了损坏或篡改。