You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 17:05:22