私はOracleのJava チュートリアルどちらもコンパイルは成功しますが、実行時にはどちらも次のエラーが発生します。
Exception in thread "main" java.lang.NoClassDefFoundError: graphics/shapes/Square
at Main.main(Main.java:7)
Caused by: java.lang.ClassNotFoundException: graphics.shapes.Square
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
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)
... 1 more
Main.java
ファイルが間違ったフォルダにある可能性があります。
ディレクトリ階層は次のとおりです。
graphics
├ Main.java
├ shapes
| ├ Square.java
| ├ Triangle.java
├ linepoint
| ├ Line.java
| ├ Point.java
├ spaceobjects
| ├ Cube.java
| ├ RectPrism.java
そしてここにありますMain.java
:
import graphics.shapes.*;
import graphics.linepoint.*
import graphics.spaceobjects.*;
public class Main {
public static void main(String args[]) {
Square s = new Square(2, 3, 15);
Line l = new Line(1, 5, 2, 3);
Cube c = new Cube(13, 32, 22);
}
}
ここで何が間違っているのでしょうか?
アップデート
Main
クラスをパッケージに入れてgraphics
(追加してpackage graphics;
)、クラスパスを「_test」(グラフィックスを含むフォルダー)に設定し、コンパイルして、java graphics.Main
(コマンドラインから)を使用して実行したところ、動作しました。
本当に遅い更新 #2
使っていなかった日食(ただメモ帳++およびJDK)で、上記のアップデートで問題は解決しました。ただし、これらの回答の多くはEclipseとIntelliJ IDEAですが、概念は似ています。
ベストアンサー1
コードをコンパイルすると、.class
プログラム内の各クラスのファイルが作成されます。これらのバイナリ ファイルは、Java がプログラムを実行するために解釈するバイトコードです。 は、クラスを動的にロードするNoClassDefFoundError
クラスローダー (この場合は) が、使用しようとしているクラスのファイルjava.net.URLClassLoader
を見つけられないことを示します。.class
必要なクラスが存在しない場合 (クラスがリフレクションでロードされない限り)、コードはコンパイルされません。そのため、通常、この例外はクラスパスに必要なクラスが含まれていないことを意味します。クラスローダー (具体的にはjava.net.URLClassLoader
) は、クラスパスの各エントリでフォルダー a/b/c/ のパッケージ abc 内のクラスを検索することに注意してください。 は、NoClassDefFoundError
コンパイルして使用しようとしている .jar ファイルの推移的な依存関係が欠落していることを示している場合もあります。
たとえば、クラス があった場合com.example.Foo
、コンパイル後にクラス ファイル が作成されますFoo.class
。たとえば、作業ディレクトリが であるとします.../project/
。そのクラス ファイルは に配置する必要があり.../project/com/example
、クラスパスを に設定します.../project/
。
補足: Java および JVM 言語用の素晴らしいツールを活用することをお勧めします。Eclipse や IntelliJ IDEA などの最新の IDE や、Maven や Gradle などのビルド管理ツールを使用すると、クラスパスについてあまり心配する必要がなくなり、コードに集中できます。とはいえ、このリンクコマンドラインで実行するときにクラスパスを設定する方法について説明します。