LinkageError是一个比较棘手的异常,准确的说它是一个Error而不是Exception。java api对它没有直接的解释,而是介绍了它的子类:
Subclasses of LinkageError indicate that a class has some dependency on another class; however, the latter class has incompatibly changed after the compilation of the former class.
似乎是说不兼容性,既编译时,A类用到B类,且这时候A和B是兼容的,但是到运行时,A类得到的B(既某个类加载器加载的B类)却不是A在编译的时候那个与之兼容的B,这个说起来比较复杂,其实就是个二进制兼容性问题,和很多程序不能在98上跑是一个道理,程序就是A,而98就是B。
事实上,真正出现二进制兼容性问题的时候,确实是报NoSuchMethodError或者NoSuchFieldError或者NoClassDefFoundError。Java api对NoSuchMethodError的解释(其他的解释几乎相同):
Thrown if an application tries to call a specified method of a class (either static or instance), and that class no longer has a definition of that method.
Normally, this error is caught by the compiler; this error can only occur at run time if the definition of a class has incompatibly changed.
关键词是“incompatibly changed ”。
事实证明,当传统意义上的二进制不兼容性(既上面举的98的例子,或者说incompatibly changed)问题发生的时候,java会报NoSuchMethodError,NoSuchFieldError或者NoClassDefFoundError,这三个类都是LinkageError的子类,所以,就好像java api对LinkageError中的解释一样“Subclasses of LinkageError indicate that……”这个解释并没有说LinkageError本身应该是在什么情况下被抛出。倒不是java api顾左右而言他,而是抛出LinkageError的情况实在是很难叙述,《深入java虚拟机》第二版用近乎一章(比较大的一章,和其它章相比)来解释这个问题。归根结底,原因是ClassLoader没有完全按照设计的那样设置:任何一个ClassLoader的实例都应该设置一个恰当的ClassLoader实例为父类加载器,并且在真正defineClass前,都应该先将这个任务委托给其父类加载器。何为恰当的ClassLoader实例?一般来说,就应该是 this.getClass().getClassLoader()(也就是ClassName.class.getClassLoader(),这两个值是同一个值)的返回值),或者是一个设计者认为合理的值。这个值应该保证“相同全限定名的类(可以认为是同一个类,仅仅是可以)不会出现在同一个类的代码中。”举例来说,在一个类的一段代码中(可以是一个方法,或者是一个static块),如果有classLoaderA加载的 test.Test类,也有classLoaderB加载的test.Test,那么,把前者的引用指向后者的实例的时候,就会报LinkageError。
分享到:
相关推荐
LinkageError如何解决.md
LinkageError解决办法.md
NULL 博文链接:https://utopialxw.iteye.com/blog/1138133
LinkageError(解决方案).md
项目中碰到的,记录一下
Burpsuite永久使用版,没有使用限制,V1.7.26版本,http抓包工具。
每个人都知道黑客只在晚上工作,所以多年来人们要求 PortSwigger 实现一个黑暗主题。当他们这样做时,黑客们到处欢欣鼓舞!但是,有些人仍然想要更多......直到...... Burp Customizer! Burp Suite 2020.12 用 ...
1. `jaxb-api.jar`:这是Java Architecture for XML Binding (JAXB)的API库,用于将Java对象转换为XML格式,以及将XML数据转换回Java对象。JAXB是Java标准版的一部分,但可能存在多个版本,不兼容的版本可能导致`...
启动Tomcat时报错:Caused by: java.lang.LinkageError: loader constraints violated when linking javax/el/ExpressionFactory class 说明:原因是juel.jar, juel-engine.jar, juel-impl.jar包和Tomcat6.0中的el-...
jaxb-2_1_9.zip jaxb最新版本 转:http://blog.sina.com.cn/s/blog_5ce5700e0100bowu.html 使用MyEclipse5.5+jboss-5.0.0.CR1+JDK1.6,在启动时报了一个错误: java.lang.LinkageError: JAXB 2.0 API is being ...
1. **无法启动Tomcat** - 错误描述:启动时出现“找不到主类”或“java.lang.ClassNotFoundException”。 - 原因分析:通常是由于`CLASSPATH`环境变量未正确设置,或者Tomcat版本与JDK版本不兼容。 - 解决方案:...
javax.servlet.ServletException: java.lang.LinkageError
* LinkageError:链接错误,例如,类文件损坏或不存在。 * Error:错误,例如,内存溢出或堆栈溢出。 * AWTError:AWT 相关的错误,例如,无法创建 GUI 组件。 * AWTException:AWT 相关的异常,例如,无法加载图像...
1. **Exception**:表示可以通过程序逻辑进行处理的异常。 - `RuntimeException`:运行时异常,通常由编程错误引起。 - 非`RuntimeException`:编译时检查异常,必须在代码中显式处理或声明抛出。 2. **Error**:...
1. 打开你的项目,在"Project Explorer"或"Package Explorer"视图中找到你的项目。 2. 右键点击项目,选择"Properties"。 3. 在打开的属性对话框中,导航到"Java Build Path"。 4. 在"Libraries"选项卡中,你会看到...