`
zhouchaofei2010
  • 浏览: 1104023 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

增量发布的NoSuchMethodError 异常

阅读更多
NoSuchMethodError多是因为类冲突,没有加载版本需要的class而加载了其他路径下的class,但是本文记录的是重载代码修改在增量发布环境下出现的异常情况!
调用者:
package util;
 
public class Invoker {
public static void main(String[] args) {
CommUtil c=new CommUtil();
String s="ssssssssss";
System.out.println(c.format(s));
}
}
 
报异常:
Exception in thread "main" java.lang.NoSuchMethodError: util.CommUtil.format(L
va/lang/String;)Ljava/lang/String;
at util.Invoker.main(Invoker.java:9)
 
 
原因是因为重载方法删除后,调用者的的代码没有重新编译。该问题出现在“增量发布”的场景,只发布了代码修改过的CommUtil.class,没有发布Invoker的class
 
 
当CommUtil.java 中有如下两个重载方法时
package util;
 
public class CommUtil {
 
public String format(String v ){
 
return "String format "+v;
}
 
public String format(Object v){
return "Object format "+v.toString();
}
 
}
 
调用类编译后class的反编译后如下:
 
D:\clstest\util>javap -c Invoker.class
Compiled from "Invoker.java"
public class util.Invoker {
public util.Invoker();
Code:
0: aload_0
1: invokespecial #8 // Method java/lang/Object."<init>":
()V
4: return
 
public static void main(java.lang.String[]);
Code:
0: new #16 // class util/CommUtil
3: dup
4: invokespecial #18 // Method util/CommUtil."<init>":()V
 
7: astore_1
8: ldc #19 // String ssssssssss
10: astore_2
11: getstatic #21 // Field java/lang/System.out:Ljava/
io/PrintStream;
14: aload_1
15: aload_2
16: invokevirtual #27 // Method util/CommUtil.format:(Ljav
a/lang/String;)Ljava/lang/String;
19: invokevirtual #31 // Method java/io/PrintStream.printl
n:(Ljava/lang/String;)V
22: return
}
 
当删除format(String v) 这个方法后,CommUtill.java内容如下:
 
package util;
public class CommUtil {
 
public String format(Object v){
return "Object format "+v.toString();
}
 
}
 
javap -c 反编译如下:
D:\src\ssm3\target\test-classes\util>javap -c Invoker.class
Compiled from "Invoker.java"
public class util.Invoker {
public util.Invoker();
Code:
0: aload_0
1: invokespecial #8 // Method java/lang/Object."<init>":
()V
4: return
 
public static void main(java.lang.String[]);
Code:
0: new #16 // class util/CommUtil
3: dup
4: invokespecial #18 // Method util/CommUtil."<init>":()V
 
7: astore_1
8: ldc #19 // String ssssssssss
10: astore_2
11: getstatic #21 // Field java/lang/System.out:Ljava/
io/PrintStream;
14: aload_1
15: aload_2
16: invokevirtual #27 // Method util/CommUtil.format:(Ljav
a/lang/Object;)Ljava/lang/String;
19: invokevirtual #31 // Method java/io/PrintStream.printl
n:(Ljava/lang/String;)V
22: return
}
 
 
总结:
 
重载是编译是的多态行为,java编译器会根据多态的方法的参数就近选择一个方法编译。如上面例子,当CommUtil 有format(String v )方法时候,Invoker 调用format时会被编译成
 16: invokevirtual #27 // Method util/CommUtil.format:(Ljav
a/lang/String;)Ljava/lang/String;
 
但是当删除format(String v )只留下format(Object v )时,会被编译成
 16: invokevirtual #27 // Method util/CommUtil.format:(Ljav
a/lang/Object;)Ljava/lang/String;
 
所以在生成环境的增量发布流程需要优化,需要注意重载代码修改后的相关优化或者谨慎对重载方法进行修改
1
0
分享到:
评论

相关推荐

    java.lang.NoSuchMethodError异常处理要点.doc

    在Java编程中,`java.lang.NoSuchMethodError`异常是一个运行时异常,通常发生在程序试图执行一个不存在的方法时。这个异常的出现通常意味着编译时和运行时的类版本不匹配,或者是在编译期间存在而运行时不存在的...

    java.lang.NoSuchMethodError异常解决

    在Java编程中,`java.lang.NoSuchMethodError`异常是一个运行时异常,通常发生在尝试执行一个在编译时可用但在运行时不可用的方法时。这个异常表明某个已经加载的类定义了一个方法,但该方法的实际行为无法被找到。...

    《 从NoSuchMethodError看jvm编译和class加载方式》的测试项目代码

    在Java开发中,`NoSuchMethodError`是一个常见的运行时异常,通常发生在试图调用一个不存在的方法时。这个错误与JVM的类加载机制密切相关。本文将深入探讨`NoSuchMethodError`,并结合“jar-duplicate-test”这个...

    解决 java.lang.NoSuchMethodError的错误

    Java.lang.NoSuchMethodError 错误是一种常见的 Java 异常,它发生在 Java 虚拟机 (JVM) 无法找到某个类的特定方法时。这种错误可能是由于项目依赖比较复杂、Java 运行环境有问题、同一类型的 jar 包有不同版本存在...

    NoSuchMethodError

    在Java编程中,`NoSuchMethodError`是一个运行时异常,通常发生在尝试执行一个包含不存在方法的代码时。这个错误表明在编译期间存在某个方法,但在运行时却无法找到。这种情况可能由于以下几种原因引起: 1. **版本...

    Java常见异常大全.pdf

    文档中还提到了很多其他的异常类型,例如AbstractMethodError、AssertionError、ClassCircularityError、ClassFormatError、Error、ExceptionInInitializerError、IllegalAccessError、IncompatibleClassChangeError...

    系统稳定性——NoSuchMethodError常见原因及解决方法1

    在实际生产环境中,NoSuchMethodError可能导致服务异常终止,甚至产生不可预测的结果。因此,对这类问题的预防和快速定位显得尤为重要。通过理解和掌握上述原因及解决方案,我们可以有效地避免和解决...

    深入解析Java中的NoSuchMethodError及其解决方案

    要解决这个异常,需要仔细检查方法签名、依赖关系、类版本冲突以及JAR包冲突。通过遵循最佳实践和使用构建工具来管理依赖,可以有效避免此类问题的发生。正确的处理NoSuchMethodError不仅保证了程序的正确性,也提高...

    Java中常见的异常分析

    26. **方法不存在错误:NoSuchMethodError** - 尝试调用不存在的类方法时抛出。 27. **内存不足错误:OutOfMemoryError** - 当内存不足以分配给新对象时抛出。 28. **堆栈溢出错误:StackOverflowError** - 递归...

    java异常汇总.txt

    ### Java异常概述与详解 在Java编程中,异常处理是一种重要的机制,用于处理程序执行过程中可能出现的错误或异常情况。Java中的异常分为两大类:**受检异常**(Checked Exceptions)和**非受检异常**(Unchecked ...

    jsp常见异常总结 希望有所帮助

    7. **java.lang.NoSuchMethodError** 当运行时系统找不到在编译时存在的方法时,会出现此异常。这可能是因为类库版本不匹配,新版本的类没有旧版本中需要的方法。 8. **java.sql.SQLException** 在进行数据库操作...

    java错误大全(包括基本异常和开源框架出现的异常)

    5. **包导入:**未导入所需包时,会抛出`NoSuchMethodError`或`NoClassDefFoundError`。确保导入所有必要的包,并检查JAR文件是否已添加到类路径。 6. **Hibernate异常:** - `MappingNotFoundException`:Eclipse...

    JAVA异常大全

    26. **NoSuchMethodError** - 尝试调用不存在的方法时抛出。 27. **OutOfMemoryError** - 内存不足时,JVM会抛出此错误。 28. **StackOverflowError** - 堆栈溢出,通常是由于递归过深造成的。 29. **ThreadDeath...

    JAVA常见异常整理.docx

    - `NoSuchMethodError`:尝试调用不存在的方法。 - `UnsatisfiedLinkError`:找不到本地方法的实现。 - `UnsupportedClassVersionError`:类文件版本不受当前Java虚拟机支持。 - `VerifyError`:类文件验证失败...

    java常见异常

    - **NoSuchMethodError**: 尝试调用不存在的方法时抛出。 - **OutOfMemoryError**: 内存不足时抛出。 - **StackOverflowError**: 堆栈溢出时抛出。 - **UnknownError**: Java虚拟机发生未知错误时抛出。 - **...

    java.lang.NoSuchMethodError: javax/servlet/jsp/PageContext.getELContext()Ljavax/

    NULL 博文链接:https://albert0707.iteye.com/blog/562969

    java异常集合

    - **NoSuchMethodError**:当应用试图调用某类的某个方法,而该类的定义中没有该方法的定义时抛出该错误。 - **OutOfMemoryError**:当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误。 - **StackOverflow...

    java 异常种类总结【转】.docx

    java.lang.NoSuchMethodError 是一种方法不存在错误,指的是在程序中尝试调用某个类的方法,但是该类的定义中没有该方法的定义时抛出的异常。 27. java.lang.OutOfMemoryError 内存不足错误 java.lang....

    Spring框架十一种常见异常的解决方法汇总

    在 Spring 框架中,如果找不到对应的方法,将会抛出 NoSuchMethodError 异常。解决方法是检查方法的名称和参数是否正确,并确保方法存在于类路径下。 了解这些常见的 Spring 框架异常及其解决方法非常重要,可以...

    Java常见异常集-Java,Hibernate,Tomcat异常

    6. **NoSuchMethodError**:此错误通常发生在运行时,表示找不到某个方法。这可能是由于类加载器加载了不兼容的类版本。检查类路径和依赖库版本以确保一致性。 7. **OutOfMemoryError: Java heap space**:表示Java...

Global site tag (gtag.js) - Google Analytics