我已经查看了类似问题的许多答案。但无法缩小解决方案。
以下是代码:(简化名称以便于阅读)
头等舱:
package p1;
public class C1 {
public static void test() {
System.out.println("Boom!");
}
}
第二课:
package p2;
import p1;
public class C2 {
public static void main(String[] params) {
C1.test();
}
}
Clean-Build不会出现任何错误。 (没有编译错误)
但是在运行时我遇到了以下错误:
Exception in thread "main" java.lang.NoSuchMethodError: C1.test()V
at C2.main(C2.java:6)
Java Result: 1
P.S。我正在使用Netbeans。
答案 0 :(得分:4)
这意味着您在类路径中使用旧版本的C2
运行您的类C1
(一个尚未使用test()
方法的版本)。
确保您某处没有C1.class
的旧版本。删除所有*.class
文件并重新编译所有文件,然后尝试再次运行它。
另外:正如Kevin Bowersox在评论中指出的那样,您的main
方法必须如下所示:
public static void main(String[] args)
必须以String[]
作为参数。
答案 1 :(得分:0)
只有当main函数将String选项卡作为args时,它才能正确编译和运行。 但是还要检查类C1和C2的版本,尝试重建项目以重新编译这些类。
public static void main(String args[]) {
C1.test();
}
答案 2 :(得分:0)
我认为您应该将其导入为 import p1。*;
您将可以访问其中的所有类和成员函数。
答案 3 :(得分:0)
Netbeans有时喜欢在发生一些变化后陷入困境,然后干净的构建不起作用。
尝试编辑最近修改过的每个文件并再次保存(例如,将空格放在随机位置)。之后,再次清理并构建项目。
答案 4 :(得分:-1)
如果我的内存刷新并且正如Jesper指出的那样,我在同一场景下也遇到了同样的问题NoSuchMethodFoundException(还有尚未清理的旧类引用)。
我刚刚将带有2个不同软件包的代码片段直接复制到我的netbean,编译和运行的C2中。它打印了BOOM!消息。
在我的案例中使用:
public static void main(String args[]){
}
编译和运行代码时,没有什么区别。
public static void main(String params[]){
}
这是有道理的,因为主类应该具有正确的main方法签名。
在这里,args或params,不应该产生巨大的变化,我相信;正如我们在方法中所拥有的只是它所使用的方法的内部主体的引用。
仍然绝对遵循main的标准签名是好的做法。
我建议清理项目并在新项目中从头开始复制内容并重新构建,有时netbeans会发疯。