Java 在运行时获取NoSuchMethodError
我已经看过许多类似问题的答案。但无法缩小范围找到解决方案 下面是代码:(简化名称以提高可读性) 头等舱:Java 在运行时获取NoSuchMethodError,java,netbeans,runtime-error,nosuchmethoderror,Java,Netbeans,Runtime Error,Nosuchmethoderror,我已经看过许多类似问题的答案。但无法缩小范围找到解决方案 下面是代码:(简化名称以提高可读性) 头等舱: 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[] param
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();
}
}
二等舱:
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();
}
}
干净的构建不会给出任何错误。(无编译错误)
但在运行时,我得到以下错误:
Exception in thread "main" java.lang.NoSuchMethodError: C1.test()V
at C2.main(C2.java:6)
Java Result: 1
另外,我正在使用Netbeans。这意味着您正在使用类路径中的类
C1
的旧版本(尚未使用test()
方法的版本)运行类C2
请确保您的某个地方没有旧版本的C1.class
。删除所有*.class
文件并重新编译所有内容,然后再次尝试运行它
另外:正如Kevin Bowersox在评论中指出的,您的main
方法必须如下所示:
public static void main(String[] args)
它必须将
字符串[]
作为参数。只有当主函数将字符串选项卡作为参数时,它才能正确编译和运行。
但也要检查C1类和C2类的版本,尝试重建项目以重新编译这些类
public static void main(String args[]) {
C1.test();
}
我认为你应该把它作为一种商品进口 进口p1.*
然后,您将可以访问其中的所有类和成员函数。Netbeans有时喜欢在一些更改后陷入困境,而干净的构建无法工作
尝试编辑最近修改的每个文件并再次保存(例如,在随机位置放置空白)。之后,清理并再次构建项目。如果我的内存刷新,并且正如Jesper指出的那样,在相同的场景下,我也遇到了同样的问题NoSuchMethodFoundException(仍然有未清理的旧类引用) 我刚刚用两个不同的包将您的代码片段直接复制到我的netbean中,并编译和运行C2。它确实打印了繁荣!信息 就我而言,使用:
public static void main(String args[]){
}
在编译和运行代码时没有任何区别
public static void main(String params[]){
}
这是有意义的,因为main类应该具有main的正确方法签名
我相信,在这里,args或params不应该有很大的区别;因为我们在方法内部拥有的只是它所使用的方法的内部主体的参考
当然,遵循main的标准签名是一种很好的做法
我建议清理项目,在新项目中从头开始复制内容并重新构建,有时netbeans可能会发疯。
C1.test()V
-这看起来可疑。V
main方法的正确签名是:公共静态void main(String[]args)
@marounnaroun这只是Java对返回void
的方法的内部表示法。我在发布问题时错过了参数。很抱歉在问题中更正。错误并不是因为这个原因造成的。@StephenC我想这就是问题所在……而且main
签名无效。尝试了这个。不工作。此外,clean build本身也会删除所有的.class文件,对吗?这确实是导致出现此类错误的唯一原因。再次检查项目是如何设置的,以及classC2
引用classC1
的位置。某些设置方式使它们不同步。