Java代码报错:类型A已定义及NoSuchMethodError问题求助
Java类重复定义与方法找不到错误排查
你定义了继承自A类的Prac2类,调用m()方法时出现两个错误,代码及报错信息如下:
原代码
package revision; public class Prac2 extends A { public void m() { System.out.println("child"); } public static void main(String[] args) { A obj1 = new Prac2() ; Prac2 obj2 = new Prac2() ; obj1.m(); obj2.m(); } } class A { public void m() { System.out.println("parent") ; } }
报错信息
Exception in thread "main" java.lang.NoSuchMethodError: 'void revision.A.m()'
at revision.Prac2.main(Prac2.java:13)
类型A已定义(The type A is already defined)
错误原因及解决办法
1. 类型A已定义
- 原因:同一个
revision包下存在多个名为A的类,可能是:- 项目里有其他
.java文件也定义了class A; - 之前编译生成的
A.class文件没清理,和当前代码编译出的类冲突; - 你把A和Prac2写在同一个文件里,这种写法不符合Java编码规范,容易引发编译冲突。
- 项目里有其他
- 解决办法:
- 检查
revision包下的所有文件,把重复的A类重命名; - 清理项目的编译输出目录(比如
bin、target),删除所有旧的.class文件,再重新编译; - 把A类单独移到
A.java文件中,Prac2类留在Prac2.java,遵循Java单文件单顶级类的规范。
- 检查
2. 找不到A类的m()方法
- 原因:这是第一个错误引发的连锁问题——编译时因为A类重复定义,导致生成的字节码混乱,或者旧的
A.class里根本没有m()方法,JVM运行时找不到对应方法。 - 解决办法:先解决A类重复定义的问题,然后重新编译所有相关类,再运行程序。
修正后的规范代码示例
A.java
package revision; public class A { public void m() { System.out.println("parent"); } }
Prac2.java
package revision; public class Prac2 extends A { @Override // 注解明确重写父类方法,避免写错方法签名 public void m() { System.out.println("child"); } public static void main(String[] args) { A obj1 = new Prac2(); Prac2 obj2 = new Prac2(); obj1.m(); // 多态调用,实际执行Prac2的m() obj2.m(); // 直接调用Prac2的m() } }
内容的提问来源于stack exchange,提问作者Tejveer naruka
相关产品推荐
相关产品推荐

