类加载常见错误

ClassNotFoundException

ClassNotFoundException 表示类找不到异常,是一种 Exception,通常发生在载入阶段,当开发者主动调用 Class.forName()ClassLoader.loadClass()或 ClassLoader.findSystemClass()动态加载指定类时候,类加载器就会去 classpath 下寻找类,如果找不到就会抛出此错误。

NoClassDefFoundError

NoClassDefFoundError 是一种和 ClassNotFoundException 很像的错误,只不过它是更严重的 error 类型。它发生在链接阶段,表示 jvm 在编译阶段可以找到相应的类,但在执行过程中却找不到相应的类。

一种原因是由于在编译后运行前类被更改或者删除了。另外一种则是 classpath 本身被修改过了,这可以通过System.getProperty("java.classpath")来找到程序实际运行的 classpath,或者通过-classpath 命令来指定正确的 classpath。

那如果是在 ide 中开发,很多时候出现的情况是我们可以通过 ide 编译通过,但在实际运行的 WEB-INF/lib 下却是没有的。所以排查的时候我们需要去实际的 war 包下面确定是否有类。

NoSuchMethodError

它表示找不到方法,但找不到方法归根结底是找到了不正确的类。

通常情况下是因为 jar 包冲突问题,即加载了不匹配版本的类导致的。例如应用中有 A、B 两个二方包,A 依赖 C-v1 包,而 B 依赖 C-v2 包,如果 maven 仲裁最后使用的是 C-v1 包,那么当 B 加载到 C-v2 中有而 C-v1 中没有的方法时就会报 NoSuchMethodError。

这种情况我们首先得知道 jvm 到底加载的是什么版本,这可以使用-verbose:class来确定。

LinkageError

LinkageError 相比较之前几种错误不那么常见,只有多个类加载器同时作用交互时才会出现。

 jvm 中一个类由全限定类名与类加载器确定类实例,那么不同类加载器加载的同一个类是属于不同类实例的,然后在内存中如果两者发生交互,就会出现 LinkageError 异常。

posted @   KLAPT  阅读(144)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
历史上的今天:
2021-03-10 CNN、RNN
点击右上角即可分享
微信分享提示