Java の Could Not Find or Load Main Class エラーの修正について
- Java で間違った名前を渡したためにエラーを見つけることができませんでした
- Java のパッケージ名が間違っているためにエラーを見つけることができませんでした
- Java の CLASSPATH が間違っているため、エラーを見つけることができませんでした
このチュートリアルでは、Java における could not find or load main class
のエラーについて紹介します。
コードを記述してコンパイルしたとします。今まではすべて正常に動作していましたが、ようやく実行するとエラーが発生しました。
could not find or load main class
このチュートリアルでは、このエラーが発生する理由とその解決方法について説明します。まず、コマンドプロンプトを使用して Java プログラムを実行する方法を要約します。
まず、次のように javac コマンドを使用してコードをコンパイルします。
javac<.java file name>
上記のコマンドを実行すると、拡張子が .class
のファイルが現在のフォルダに作成されます。
.class
ファイルは、.java
プログラムと同じクラスになります。次に、次のコマンドを使用して .class
ファイルを実行し、Java コードを実行します。
java<classname>
could not find or load main class
エラーが発生する場合があります。このエラーは実行時エラーであり、Java 仮想マシンが実行しようとしているメインクラス(main メソッドを含むクラス)を見つけられない場合に発生します。
このエラーは、コマンドプロンプトを使用して Java プログラムを実行しているときに最も一般的に発生します。このエラーの原因を説明する前に、まず CLASSPATH を理解しましょう。
Java の CLASSPATH
これは、executable.class
およびその他のリソースファイルです。
JVM はそれを使用してファイルを検索します。システム変数に CLASSPATH を明示的に設定しない限り、デフォルトの CLASSPATH は現在のディレクトリです。
プログラムを実行するには、クラス名を渡す必要があります。ポイントを説明するために、次の例を取り上げます。
public class DelftStack {
public static void main(String args[]) {
System.out.println("Hello from DelftStack");
}
}
まず、javac コマンドを使用してコンパイルしてみましょう。
C :\Users\User\Documents\DelftStack\java
> javac DelftStack.java C :\Users\USer\Documents\DelftStack\java
>
上記のコマンドを実行すると、現在のディレクトリに DelftStack.class
ファイルが作成されます。java コマンドを使用してそのファイルを実行してみましょう。
C :\Users\User\Documents\DelftStack\java
> java DelftStack.class Error : Could not find or load main class DelftStack.
class Caused by : java.lang.ClassNotFoundException : DelftStack.class
ここでは、.class
ファイルを実行しようとしているため、エラーが発生しています。代わりに、クラス名を渡す必要があります。
以下を見てください:
C :\Users\User\Documents\DelftStack\java > java DelftStack Hello from DelftStack
Java で間違った名前を渡したためにエラーを見つけることができませんでした
間違ったクラス名を渡した場合にも、could not find or load the main class
が発生する可能性があります。前の例を続けると、次のように間違った名前でプログラムを実行しようとすると、次のようになります。
C :\Users\User\Documents\DelftStack\java > java DelftStac Error
: Could not find or load main class DelftStac Caused by : java.lang.ClassNotFoundException
: DelftStac
クラス名のつづりを間違えたため、上記のエラーが発生します。ここで、JVM は、存在しない DelftStac
という名前のクラスを実行しようとしています。
この問題は、クラス名を次のように正しく入力することで解決できます。
C :\Users\User\Documents\DelftStack\java > java DelftStack Hello from DelftStack
ここで、クラス名では大文字と小文字が区別されることにも注意してください。クラス Delftstack
を実行すると、エラーが発生します。
以下を見てください:
C :\Users\User\Documents\DelftStack\java > java Delftstack Error
: Could not find or load main class Delftstack Caused by : java.lang.NoClassDefFoundError
: Delftstack(wrong name
: Delftstack)
ファイルを正常に実行するには、正しいスペルと正しい大文字小文字を使用する必要があります。
Java のパッケージ名が間違っているためにエラーを見つけることができませんでした
DelftStack
クラスを com.DelftStack
パッケージに移動しましょう。パッケージは、類似したクラスをまとめるために使用されます。
次のコードを見てください。
package com.DelftStack;
public class DelftStack {
public static void main(String args[]) {
System.out.println("Hello from DelftStack");
}
}
Java でパッケージをコンパイルするには、次のコマンドを使用します。
javac - d.<.java file name>
-d
フラグスイッチは、生成されたクラスファイルを保持する場所を指示するために使用されます..
はカレントディレクトリを意味します。
上記のコードを次のようにコンパイルします。
C :\Users\User\Documents\DelftStack\java > javac - d.DelftStack.java
上記のコマンドを実行すると、現在のディレクトリに次のフォルダ構造が作成されます。
com\DelftStack\DelftStack.class
ご覧のとおり、クラスファイルは現在のディレクトリから 2つのフォルダの深さです。したがって、以前の場合と同じようにクラスファイルを実行しようとすると、エラーが発生します。
C :\Users\User\Documents\DelftStack\java > java DelftStack Error
: Could not find or load main class DelftStack Caused by : java.lang.ClassNotFoundException
: DelftStack
このエラーの理由は、現在のフォルダーに DelftStack
クラスが存在しないためです。パッケージに含まれるクラスを実行するには、完全修飾名(この場合は com.DelftStack.DelftStack
)を渡す必要があります。
C :\Users\User\Documents\DelftStack\java > java com.DelftStack.DelftStack Hello from DelftStack
これは、Java に com\DelftStack
フォルダ内のクラスを探すように指示します。
Java の CLASSPATH が間違っているため、エラーを見つけることができませんでした
CLASSPATH は、.class
ファイルが存在する場所を JVM に通知します。
現在別のフォルダにいて、クラスファイルが別のフォルダにある Java プログラムを実行するとします。この場合、-classpath
オプションを使用してクラスファイルの場所を渡すことができます。
例えば:
java - classpath XYZ / ABC < class name
>
上記のコマンドは、Java に ZYX/ABC
フォルダ内の .class
ファイルを探すように指示します。
前のケースでは、パッケージを作成しました。
com/DelftStack
フォルダー内でファイルを実行するとします。次のコマンドを使用して、これを行うことができます。
> java - classpath../../ com.DelftStack.DelftStack Hello from DelftStack
../
は親ディレクトリを意味します。したがって、../../
は 2つのディレクトリレベルを検索することを意味します。
別の例を見てみましょう。デスクトップ(フォルダー)の場所にいて、コンピューター上の別の場所でクラスファイルを実行したいとします。以下でそうすることができます。
> java - cp C :\Users\User\Documents\DelftStack\java com.DelftStack.DelftStack Hello from DelftStack
-cp
フラグは -classpath
の省略形です。ここでは、.class
ファイルが存在するフォルダーの完全な場所を渡しました。