ClassNotFoundException
问题原因:运行时异常,主要是找不到对应的class。
遇到的场景:
1、调用class的forName方法时,找不到指定的类
2、ClassLoader 中的 findSystemClass() 方法时,找不到指定的类
3、ClassLoader 中的 loadClass() 方法时,找不到指定的类
解决办法:
1 、idea查询该class来源哪个包,哪个版本
2、 是否使用了重复的类库,且版本不一致,导致低版本被优先使用
3、引入对应的jar的maven依赖即可
NoClassDefFoundError
问题原因:编译时异常,找不到对应的class
遇到的场景:
1、类依赖的class或者jar不存在
2、类文件存在,但是存在不同的域中
3、大小写问题,javac编译的时候是无视大小的,很有可能你编译出来的class文件就与想要的不一样!这个没有做验证。
解决办法:
1、引入对应的jar包即可。
NoSuchMethodError
问题原因:运行时异常,在运行中找不到运行的方法导致的。
解决办法:
1、 可能jar包依赖冲突,包的高低版本不一样,通过依赖仲裁排查或者指定对应的jar包即可。
2、 可能两个jar包有相同的类与方法,导致程序调用过程中找不到正确的方法。排除掉不要的jar包。如果两个jar都需要,可以调整对应的maven依赖顺序,使得方法可以被正确加载。
不同包存在相同类路径名
解决办法:
1、 如果可以排除的话,排除不需要的jar。
2、将需要加载的包放在maven的前面,会被jvm优先加载.
具体问题是,如果两个jar包里面有相同的包,有相同的类名,如果同时引用了这两个jar,就可能会产生引用的类不对的问题。
要知道这个问题产生的原因,就要了解JVM加载的方法。JVM在加载包的时候,是按CLASSPATH的路径从上往下找,找到第一个后就将这个包引用。
这时如果包名和类名都相同,那么JVM就没法区分了。一般来说我们用的IDE都是会提示发生冲突而报错的,如果不报错的话,那么就只有第一个包被引入,即在CLASSPATH路径下排在前面的包,第二个包会在classLoader加载类的时候判断重复而忽略。
知道了JVM加载包的方法,那么解决问题就很容易了,只需要将需要引用包的jar放在前边就可以了,也就是说放在CLASSPATH路径下前沿的位置。