0

当我运行 test.class 时,我收到以下错误:

Exception in thread "main" java.lang.NoSuchMethodError: ml.Temp.<init>(Ljava/lang/String;II)V
    at test.main(test.java:11)

这是 test.java 的代码

import java.io.*;
import ml.*;

class test
{
        public static void main(String[] args) throws FileNotFoundException, IOException
        {
                String filename = "input";

                Temp id = new Temp(filename, 6, 100);
                    id.someFunction();          
         }
}

本质上,我有一个包含 Temp.class 的 jar 文件(Temp 是我编写的库文件,位于 ml 包下)。Temp 有一个构造函数,它接受这三个参数和一个公共的 someFunction。

不确定这是否有帮助,但我在编译期间包含了 jar 文件的类路径。当我在 test.class 运行期间包含 jar 文件的类路径时,我得到以下信息

Exception in thread "main" java.lang.NoClassDefFoundError: test
Caused by: java.lang.ClassNotFoundException: test
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: test. Program will exit.

编辑:

如果有帮助,我编译如下(ml.jar 和 test.java 在同一目录中)

javac -cp ml.jar test.java
4

3 回答 3

1

java -cp <path-to-ml.jar> test您应该从所在的路径运行命令test.class

编辑

NoSuchMethodError表示在类的第 11 行中,您test正在尝试使用ml.ID3(not !) 的构造函数和不存在Temp的签名 ( )。String, int, int这并不意味着它不在类路径中,因为这会导致NoClassDefFoundError.

另一方面,NoClassDefFoundError: test不再test存在于您的 clsspath 中的方法。将 jar 添加到类路径中,如果您确实为获取 jar 所做的一切NoClassDefFoundError: test不会导致test从您的类路径中消失......因此,您更有可能做了其他一些无意的操作。

编辑 2

也许该构造函数存在于ID3您的开发环境中,但它显然不存在于您的运行时环境中。如果它是第 3 方 jat,可能会发生您有该 jar 的两个版本,一个在开发中使用,另一个在运行时使用。或者甚至可能两者都出现在您的运行时环境中,但缺少构造工具优先级。

于 2012-02-09T08:00:41.070 回答
1

我将假装成你,经历整个过程:

1 - 图书馆。我在一个名为的目录中,比如说workspace。在其中,我创建了一个名为ml.
在该ml目录中,我创建了一个名为的新文件Temp.java,例如,该文件包含以下内容:

package ml;

public class Temp
{
    public Temp(String filename, int arg1, int arg2)
    {
        //do something
    }

    public void someFunction()
    {
        //do something else
        System.out.println("look left!");
    }
}

我现在要编译库类并创建一个库 jar。首先我通过运行编译

javac ./Temp.java

目录里面mlworkspace然后我通过将一个目录向上移动到该目录并运行来 jar 库:

jar cf ml.jar ml/

2 - 程序。我现在Test.java在目录中创建文件workspace。该文件包含以下内容:

import java.io.*;
import ml.*;

public class Test
{
    public static void main(String[] args) throws FileNotFoundException, IOException
    {
        String filename = "input";

        Temp id = new Temp(filename, 6, 100);
        id.someFunction();
    }
}

3 - 结果。我现在继续编译并运行我的测试程序。在workspace我运行的目录中:

javac -cp ./:ml.jar ./Test.java

我终于可以通过在workspace目录中运行以下命令来运行程序:

java -cp ./:ml.jar Test

这将显示输出:

look left!

我希望这有帮助。

于 2012-02-09T18:15:49.770 回答
1

如果没有源代码,很难准确地告诉您发生了什么,但看起来您的库和使用它的项目不同步。您是否更改了库/项目中任何方法的签名?我建议重新编译所有内容,然后检查该类test是否使用您重新编译的库的最新版本以及它是否已声明public

关于如何阅读NoSuchMethodError等的更多有用信息可以在这里的一篇很棒的文章中找到:http ://www.cubrid.org/blog/dev-platform/understanding-jvm-internals/

于 2012-02-09T08:01:45.593 回答