最近 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.java
とCircle.java
fromの両方を次のような操作でコンパイルすると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:\test
JAVA ファイルがフォルダー内からコンパイルされるのに、コンパイルされた Circle ファイルがそのエラーを生成する理由を誰かが説明できますか? CLASSPATH に何か問題がありますか? 読んでくれてありがとう、そしてうまくいけば今後の解決策をありがとう!
編集: もう少しテストを行ったところ、ディレクトリからファイルShape.java
とCircle.java
ファイルをコンパイルしても、C:\test
ディレクトリから実行すると機能することがC:\
わかりました。これで何か変わりますか?
編集 2: さらにテストした結果、コマンド java test.Circle を使用する限り、C:\test ディレクトリ内から Shape.java ファイルと Circle.java ファイルを実際にコンパイルして実行できることがわかりました。JVM がクラスを探す方法を誤解していました。パッケージのインポートステートメントを分析するときに、コンパイラと同じ方法を使用することがわかりました。