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)
答案 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,......这样可以清除"清理"编译输出,或者自动重新编译需要重新编译的所有工件。