在Java项目进行增量更新的时候经常会出现java.lang.NoSuchMethodError的问题,究其原因有很多:
1、在引包是引用了不匹配的包版本
2、开发环境和运行环境的不一致
3、以上两点都齐全,并且确实有对应的方法存在,依然报java.lang.NoSuchMethodError错误
。。。
本文章主要解决第三种问题:对应的方法存在却依然报java.lang.NoSuchMethodError错误
错误重现:
搭建Java工程,并生成如下两个类
TestNoSuchMethodError用于测试
package com.timen.demo; public class TestNoSuchMethodError { public static void main(String[] args) { Person p = new Person(); p.setName("timen"); p.setSuperUser(true); System.out.println(p.getName() + " is Super User? " + p.isSuperUser()); } }Person
package com.timen.demo; public class Person { private String name; private boolean superUser; public Person() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isSuperUser() { return superUser; } public void setSuperUser(boolean superUser) { this.superUser = superUser; } }注意:该类的superUser属性为boolean原生数据类型
执行TestNoSuchMethodError,结果如下:
D:\MyWorkspace\sts\NoSuchMethodError\bin>java com.timen.demo.TestNoSuchMethodError timen is Super User? true D:\MyWorkspace\sts\NoSuchMethodError\bin>将这两个类的编译后的Class文件(包括包目录)保存到其他目录下(相当于发布工程到正式环境中),然后修改Person类
package com.timen.demo; public class Person { private String name; private Boolean superUser; public Person() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public Boolean isSuperUser() { return superUser; } public void setSuperUser(Boolean superUser) { this.superUser = superUser; } }注意:这里将superUser属性的类型改为Boolean(boolean的封装类型)
然后将编译后的Person.class拷贝到刚刚发布的项目中替换掉刚才的Person.class文件(注意你没有更改TestNoSuchMethodError类,所以大多你不会想更新这个类)
问题发生了:
D:\temp>java com.timen.demo.TestNoSuchMethodError Exception in thread "main" java.lang.NoSuchMethodError: com.timen.demo.Person.setSuperUser(Z)V at com.timen.demo.TestNoSuchMethodError.main(TestNoSuchMethodError.java:7) D:\temp>报出java.lang.NoSuchMethodError: com.timen.demo.Person.setSuperUser(Z)错误。
该java.lang.NoSuchMethodError为setSuperUser(Z)对应的方法应该是setSuperUser(boolean var)
而在新的Person文件中的setSuperUser方法的签名为可以用javap -s Person查看:
D:\temp\com\timen\demo>javap -s Person Compiled from "Person.java" public class com.timen.demo.Person extends java.lang.Object{ public com.timen.demo.Person(); Signature: ()V public java.lang.String getName(); Signature: ()Ljava/lang/String; public void setName(java.lang.String); Signature: (Ljava/lang/String;)V public java.lang.Boolean isSuperUser(); Signature: ()Ljava/lang/Boolean; public void setSuperUser(java.lang.Boolean); Signature: (Ljava/lang/Boolean;)V } D:\temp\com\timen\demo>这里就查到原因了,Java在编译的时候确定方法的签名,而Boolean为引用类型使用Ljava/lang/Boolean;签名,而boolean为原生数据类型,用Z作为签名,所以两次编译TestNoSuchMethodError所生成的字节码并不相同。而我们在做手动增量更新的时候又竟然忘记,就会出现java.lang.NoSuchMethodError错误。
相关推荐
- **测试与调试**:提供了测试和调试 ETL 流程的最佳实践。 - **文档编写**:强调了为解决方案撰写文档的重要性。 ##### 4.2 调度与监控 - **调度机制**:讲解了如何设置 ETL 作业的自动调度。 - **监控技术**:...
《Unity中的蓝牙低功耗(Bluetooth LE)技术详解》 在移动应用开发领域,尤其是在游戏开发中,Unity...在实际开发中,理解BLE的基本原理,掌握这个插件的使用方法,以及关注平台间的兼容性和安全性,都是至关重要的。
- "Exception in thread "main" java.lang.NoSuchMethodError: main"意味着缺少主方法,每个Java应用程序都需要一个`public static void main(String[] args)`方法作为入口点。 12. **package**: - Package是...
使用 `javax.*` 包时出现 “Exception in thread "main" java.lang.NoSuchMethodError: main” 错误的原因? 这种错误通常是由于试图运行的 Java 类没有正确定义 `public static void main(String[] args)` 方法。...
而"Exception in thread "main" java.lang.NoSuchMethodError: main"错误则意味着缺少了主程序入口点——`public static void main(String[] args)`方法。 `package`是Java中的命名空间机制,用于避免类名冲突。...
- "Exception in thread "main" java.lang.NoSuchMethodError: main"意味着找不到主方法,确保每个Java源文件只有一个public类,并且这个类包含`public static void main(String[] args)`方法。 以上内容涵盖了...
- 执行`java Speak`时的错误提示:`Exception in thread "main" java.lang.NoSuchMethodError: main`,原因是`Speak`类中没有定义`main`方法。 - 执行`java xiti8`时的错误提示:`Exception in thread "main" java...
nested exception is Java.lang.NoSuchMethodError: javassist.util.proxy.ProxyFactory.setUseCache(Z)V ``` 从错误信息中我们可以看出,问题出现在Spring Bean创建失败上,具体涉及到的Bean有`shiroFilter`、`...
本文旨在全面总结Java中常见的异常类型及其解决策略,帮助开发者更好地理解和处理程序中的异常情况。 #### 一、常见异常类别 ##### 1. **算术异常类**:`ArithmeticException` - **定义**:当执行算术运算时遇到...
Java编程语言在运行过程中可能会遇到各种异常和错误,这些异常和错误是程序运行不正常的表现,需要开发者进行处理或修复。这里我们将详细讨论Java中的运行时异常和错误。 首先,运行时异常是程序在执行过程中可以...
在Java中,异常被组织成一个层次结构,根类是`java.lang.Throwable`,它有两个主要的子类:`Error`和`Exception`。`Error`通常表示系统级的错误,比如内存不足(`OutOfMemoryError`)或虚拟机错误(`...
### IT知识点解析:Java三大框架常见问题与解决方案 #### 一、日志配置与Spring框架集成问题 ...通过上述问题分析与解决方案,可有效提升开发效率,减少调试时间,确保应用程序的健壮性和用户满意度。