1

最近 Java の学習を始めましたが、Java に関連する問題がいくつかありNoClassDefFoundErrorます。このサイトや他の場所から解決策を調べようとしましたが、まだ解決できません。プログラムを実行するたびに定義するのではなく、CLASSPATH 環境変数を設定して Windows 7 コマンド プロンプトからプログラムを実行しています。に設定されていC:ます。トラブルシューティングを行うために、ディレクトリ構造を簡略化したテスト パッケージを作成しました。

にはC:\test、 と がShape.javaありCircle.javaます。Shape.java次のようになります。

package test;

class Shape {
    void draw() { System.out.println("Drawing a new shape"); }
}

次のようになりCircle.javaます。

package test;

public class Circle extends Shape {
        public static void main(String[] args) {
        Circle round = new Circle();
        round.draw();
    }
}

コマンドプロンプトでShape.javaCircle.javafromの両方を次のような操作でコンパイルするとC:\

C:\>javac test\Shape.java 
C:\>javac test\Circle.java

そして、コンパイルされたCircle.classファイルを次のように実行します

C:\java test\Circle

期待どおりの出力が得られます。

Drawing a new shape

ただし、 and をコンパイルするShape.javaと、そのようなものCircle.javaの中からC:\test

C:\test>javac Shape.java 
C:\test>javac Circle.java

そして、Circle.classどこからでも実行しようとします

C:\test>java Circle

またはこのように

C:\> java test\Circle

次のエラー メッセージが表示されます。

Exception in thread "main" java.lang.NoClassDefFoundError: Circle (wrong name: t
est/Circle)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:792)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:14
2)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)

C:\testJAVA ファイルがフォルダー内からコンパイルされるのに、コンパイルされた Circle ファイルがそのエラーを生成する理由を誰かが説明できますか? CLASSPATH に何か問題がありますか? 読んでくれてありがとう、そしてうまくいけば今後の解決策をありがとう!

編集: もう少しテストを行ったところ、ディレクトリからファイルShape.javaCircle.javaファイルをコンパイルしても、C:\testディレクトリから実行すると機能することがC:\わかりました。これで何か変わりますか?

編集 2: さらにテストした結果、コマンド java test.Circle を使用する限り、C:\test ディレクトリ内から Shape.java ファイルと Circle.java ファイルを実際にコンパイルして実行できることがわかりました。JVM がクラスを探す方法を誤解していました。パッケージのインポートステートメントを分析するときに、コンパイラと同じ方法を使用することがわかりました。

4

3 に答える 3

1

クラスパスが で囲まれている限り、システムのどこにいてもかまいません。

そうして初めて、Java VM はクラスパスをスキャンtest.Circleし、パッケージ内のクラスを見つけることができますtest

したがって、正しい実行はjava test.Circle(常に)であり、クラスパスは利用可能なものを指す必要が\test\Circle.classあります。Circle.classが期待どおりの場所にあることを確認してください。

于 2013-07-15T08:40:18.893 に答える
0

コンパイルする、使用する

javac -d . Shape.java
javac -d . Circle.java

走る

java test.Circle

-d宛先ディレクトリを選択するための
.もので、現在のディレクトリを意味しますしたがって、現在のディレクトリC:\test\で、Java ファイルをコンパイルすると、test(パッケージ名) という名前の新しいディレクトリが作成され、その中にクラス ファイルが作成されます。すなわち。
C:\test\test\Shape.javaC:\test\test\Circle.java

于 2013-07-15T09:03:40.230 に答える