java - 为什么我在这段代码中收到 NoSuchMethodError 错误?

标签 java

import java.util.*;

public class Lab50 {    
    public static void main(String[] args) {
        System.out.println("Student Information");
        TreeSet set = new TreeSet();
        set.add(new Student(87, "Andy"));
        set.add(new Student(99, "Bichel"));
        set.add(new Student(12, "Chuck"));
        set.add(new Student(45, "David"));

        Iterator it = set.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
}

class Student implements Comparable {    
    int sid;
    String name;

    Student(int sid, String name) {
        this.sid = sid;
        this.name = name;
    }

    public int compareTo(Object obj) {
        if (obj instanceof Student) {
            Student st = (Student) obj;
            return this.sid - st.sid;
        }
        return 0;
    }

    public String toString() {
        return sid + "\t" + name;
    }
}

我在添加 Andy 元素的第一行遇到错误。以下是控制台上的错误消息:

Exception in thread "main" java.lang.NoSuchMethodError: Student.(ILjava/lang/String;)V at Lab50.main(Lab50.java:6)

最佳答案

javadoc这个异常(exception)非常清楚:

Thrown when a particular method cannot be found.

这意味着:在运行时,当你的 JVM 执行一个类时; JVM想要调用某个方法。它查看相应的类 - 并且在该类中找不到具有该名称/签名的方法。在您的情况下,编译的 Student.class 只是包含适合预期用途的构造函数。

当你有 A.java 和 B.java 时就会发生这种情况; A 正在调用 B 中的某些内容。然后您更改 B.java,并重新编译它;但你忘了重新编译 A.java。

换句话说:您遇到了不一致的情况,某些 A 类试图使用 B.class 实际上不包含的某些 B 类的方法。

这里的真实答案是:确保编译的输出始终一致。含义:将所有内容重新编译在一起。

在“现实”世界中,此类事情是由构建系统处理的。换句话说:如果您想避免此类问题,请使用一个 IDE 来跟踪项目中的所有类,并在您将它们插入到代码中时告诉您此类问题;或者学习如何使用构建系统,例如 ant、maven、gradle...,它可以“清理”构建输出,或者自动重新编译所有需要重新编译的工件。

关于java - 为什么我在这段代码中收到 NoSuchMethodError 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44966021/

相关文章:

java - 尽管有正确的命名空间声明,我的 XSD 仍不验证 XML

java - EditText 输入类型文本密码未更改

java - 是否有可能 .flatMap() 或 .collect() 均匀多个集合

java - 如何通过mockito模拟resttemplate

java - 绘制多边形: unable to find error

java - 在 Java 中为 onClick 函数分配快捷键

java - 在碧 Jade 报告中将字符串格式化为货币格式

java - 如何在android中从 "Monday"获取像 "2015-02-24"字符串这样的一天

java - 需要帮助将字符串转换为十六进制字节

java - 健全的设计方案