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的原因的更多相关文章

  1. 修改List报ConcurrentModificationException异常原因分析

    使用迭代器遍历List的时候修改List报ConcurrentModificationException异常原因分析 在使用Iterator来迭代遍历List的时候如果修改该List对象,则会报jav ...

  2. ionic build android 中的报错详细原因以及解决方法

    一.执行打包命令 ionic build android 1.报错: 原因: 其实也并非报错,但是会一直在下载gradle,由于网络或者其他原因,导致下载比较慢, 解决方案: 手动下载gradle,并 ...

  3. 服务端返回的json数据,导致前端报错的原因及解决方法

    前言 最近在开发的过程中遇到了一个问题:后端传过来的json字符串不是标准的json字符串 导致报错的原因 后端传过来的json字符串中包含一些不标准的字符或错误的引号嵌套 1)\n 2) \r 3) ...

  4. SpringBoot注册Windows服务和启动报错的原因

    SpringBoot注册Windows服务和启动报错的原因 Windows系统启动Java程序会弹出黑窗口.黑窗口有几点不好.首先它不美观:其次容易误点导致程序关闭:但最让我匪夷所思的是:将鼠标光标选 ...

  5. Springboot 启动文件报错,原因是@ComponentScan写成了@ComponentScans

    Springboot 启动文件报错,原因是@ComponentScan写成了@ComponentScans

  6. eclipse里index.jsp头部报错的原因和解决方法

    index.jsp的头<%@这句报错的话,是因为没有引入Tomcat的原因.解决:A:Window---Preferences---server---RuntimeEnviroments--Ad ...

  7. zookeeper各种报错、原因及解决方法汇总(持续更新)

    [root@iZ23nn1p4mjZ zookeeper-3.4.10]# bin/zkCli.sh -server localhost:2181,localhost:2182,localhost:2 ...

  8. 本地仓库有jar包maven依然报错的原因

    本地Maven仓库有所需jar包依然报错,missing……………… 既然有这个jar包为什么还会报错呢? 找到本地仓库后发现里面有一个_remote.repositories文件 问题在_remot ...

  9. 使用迭代器遍历List的时候修改List报ConcurrentModificationException异常原因分析

    在使用Iterator来迭代遍历List的时候如果修改该List对象,则会报java.util.ConcurrentModificationException异常,下面看一个例子演示: package ...

随机推荐

  1. haproxy 负载elasticsearch 切换

    Attempted to send a bulk request to Elasticsearch configured at '["http://192.168.32.152:9200&q ...

  2. 【转】Java基本数据类型

    原文网址:http://blog.csdn.net/bingduanlbd/article/details/27790287 Java语言是静态类型的(statical typed),也就是说所有变量 ...

  3. C# 知识点收集

    1. 数组复制 byte[] source; byte[] dest; int srcOffset = 0; int dstOffset = 0; int count = 10; System.Buf ...

  4. YUM配置

    一.yum环境的本地源搭建(基于VSFTP): 1)安装vsftp;    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@         [root ...

  5. python之路-模块安装 paramiko

    paramiko介绍(全是洋文,看不懂啊,赶紧有道翻译吧,等有朝一日,我去报个华尔街): "Paramiko" is a combination of the esperanto ...

  6. OpenVPN莫名其妙断线的问题及其解决

    1.问题 不得不说,这是一个OpenVPN的问题,该问题几乎每个使用OpenVPN的人都碰到过,也有很多人在网上发问,然而一直都没有人能给出解决办法,甚至很多帖子上表示因为这个问题而放弃了使用Open ...

  7. Cocos2d-x 3.0rc0版本号项目的创建和部署

    <1>执行setup.py 依照提示.加入你须要加入的环境变量 <2>创建项目批处理文件Create-Cocos2d-x 3.0-Project.bat 内容例如以下: @ec ...

  8. JMeter一个错误the target server failed to respond--JMeter坑

    问题:1.在测试一个http景象,特别是集波动TPS时刻,出现了一个错误.它现在是一个必须错误(压力顺利时却零星的错误,甚至很少见): 每次必现错误(開始一直怀疑是网络或程序的问题)   2.失败事务 ...

  9. TCP三次握手的过程

    三次握手 下图就是wireshark抓包工具抓获的TCP连接建立的三次握手过程: http://www.cnblogs.com/hnrainll/archive/2011/10/14/2212415. ...

  10. nopCommerce架构分析系列(二)数据Cache

    原文(http://www.cnblogs.com/gusixing/archive/2012/04/12/2443799.html)非常感谢作者顾思行的分享! 序言 在很多访问量较大的系统中,尤其在 ...