Sogrey / Android_QA

https://sogrey.github.io/Android_QA/
MIT License
0 stars 0 forks source link

你在开发中碰到过 ClassNotFoundException 和 NoClassDefFoundError 吗?它们有什么区别? #150

Open Sogrey opened 4 years ago

Sogrey commented 4 years ago

首先这俩个错误都代表着 JVM 无法找到相关的类而抛出的错误,但是它们发生的场景,以及类型却截然不同。

类型

从类型上来说 ClassNotFoundException 是 Exception 系的,而 NoClassDefFoundError 是 Error 系的,虽然他们都是 Throwable 的子孙,但是使用场景却截然不同。

Error 系的错误一旦抛出,则代表着这个错误是无法修复的,应用程序不应当去捕捉这个错误,因为这个类型的错误正常情况下永远也不会出现。

Exception 系的轻微一点,这种错误允许我们在应用程序中处理,是一种可以预知的错误。

发生场景

ClassNotFoundException 一般会在我们的应用程序去试图加载一个类的时候,发现当前类路径中无法找到该类的 class 文件而抛出的,例如如下几个方法:

Class 的 forName 方法

ClassLoader 的 findSystemClass 和 loadClass 方法

虽然 NoClassDefFoundError 也是在 JVM 试图加载一个类的时候发现类不存在然后抛出的错误,但是它是在我们使用 new 来实例化一个对象的时候抛出的。


选自 https://mp.weixin.qq.com/s/C3LdKfnjeajYR6e-x_Idrw