曹耘豪的博客

ClassNotFoundException 与 NoClassDefFoundError

  1. ClassNotFoundException
    1. 什么时候报错?
  2. NoClassDefFoundError
    1. 什么时候报错?

ClassNotFoundException

什么时候报错?

当应用尝试用字符串名称通过下面的方法装载一个类时这个类的定义却没有找到时会抛出的异常

1
2
3
Class.forName
ClassLoader.findSystemClass
ClassLoader.loadClass

NoClassDefFoundError

什么时候报错?

当JVM或者ClassLoader实例尝试装载一个类的定义(这通常是一个方法调用或者new表达式创建一个实例过程的一部分)而这个类定义并没有找时所抛出的错误。

当编译的时候可以找到这个类的定义,但是以后这个类不再存在。

比如,gradle引入一个编译过的jar包,使用exclude去掉yyy包的引用,在外面引入yyy-new代替之,如下:

1
2
3
4
compile ("com.xxx.xxx") {
exclude(group: 'com.zzz', module: 'yyy')
}
compile "com.zzz:yyy-new:$yyyVersion"

如果yyy包含了yyy-new没有的类,且被调用了,则会报该异常。

   /