为什么我在这段代码中得到NoSuchMethodError?

时间:2017-07-07 08:25:40

标签: 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元素的第一行收到错误。以下是控制台上的错误消息:

  

线程中的异常" main" java.lang.NoSuchMethodError:Student。(ILjava / lang / String;)V           在Lab50.main(Lab50.java:6)

1 个答案:

答案 0 :(得分:1)

该异常的javadoc非常明确:

  

无法找到特定方法时抛出。

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

当你有A.java和B.java时会发生这种情况; A在B中调用一些东西。然后你改变B.java,并重新编译它;但你忘了重新编译A.java。

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

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

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