修正:メインクラスが見つからなかったか、ロードできませんでした

コマンドプロンプトでjavaコマンドを使用し、端末でクラス名を指定してJavaプログラムを起動すると、「メインクラスが見つかりませんでしたか、ロードできませんでした」というエラーが発生します。これが発生する理由は、主にクラスを宣言する際のユーザーのプログラミングの誤りによるものです。

Javaコマンドラインでメインクラスが見つからないか、ロードできませんでした

前述のように、このエラーはほとんどシステムに関連しておらず、以下に示すように、ユーザーはいくつかのシナリオでミスを犯します。先に進む前に、Javaプログラミング言語とその機能についての基本的な知識があることを前提としています。

Javaで「メインクラスが見つかりません、またはロードできませんでした」というエラーの原因は何ですか?

「メインクラスを検出またはロードできませんでした」というメッセージは、Javaエンジンが実行するクラスをフェッチする最初のステップが失敗したことを意味します。javaコマンドをすることができませんでした見つけ正しいディレクトリにクラスを。

場合によっては、正しいファイルパスを追加し、Javaターミナルが正しい場所を指すようにする必要があります。コマンドラインターミナルからコマンドを実行しているため、コンピューターはクラスがどこにあるのか、またはどこにあるのかわかりません。ターゲットIDEでは、IDEが現在の作業ディレクトリを指すポインタを保持しているため、これは問題ではありません。

「java」構文とは何ですか?

実行しようとしたときにターミナルがエラーを返す理由のトラブルシューティングを開始する前に、まずコマンドの構文を確認する必要があります。正しい構文を使用していない場合、必然的にこのエラーに直面します。

コマンドの通常の構文は次のようなものです:

 java [...] [...]

これはコマンドラインオプションであり、完全修飾Javaクラス名であり、パッケージ全体がコンパイルされるときにアプリケーションに渡されるコマンドライン引数です。

有効なコマンドの例は次のとおりです。

java -Xmx100m com.acme.example.ListAppuals kevin arrows bart

上記のコマンドは、javaコマンドに次の操作を実行させます。

  • クラス「com.acme.example.ListAppuals」のコンパイル済みバージョンを検索します。
  • 検索後、クラスをロードします。
  • 次に、クラスがロードされると、クラスは有効なシグネチャ、修飾子、および戻り値の型を持つ 'main'メソッドを検索します。サンプルのメインクラスは次のようになります。
public static void main(String [])
  • このメソッドは、引数「kevin」、「arrows」、および「bart」をstring []として呼び出します。

「メインクラスが見つからないか、ロードできませんでした」を修正する方法

解決策1:クラス名の引数を確認する

ユーザーが犯す最も一般的な間違いは、引数として間違ったクラス名を提供することです(または正しいクラス名は間違った形式です)。コマンドラインでパラメーターを宣言しているため、クラス名の引数を間違った形式で渡す可能性が高くなります。ここでは、間違いを犯す可能性のあるすべてのシナリオをリストします。

  • 単純なクラス名を書く。「com.acme.example」などのパッケージでクラスを宣言する場合は、Javaコマンドでパッケージを含む完全なクラス名を使用する必要があります。
java com.acme.example.ListAppuals

の代わりに

java ListAppuals
  • あなたは、必要があるクラス名を宣言するファイル名またはパス名を宣言するのではなく。クラスのパス名/ファイル名を宣言した場合、Javaはクラスをフェッチしません。不適切なエントリには、次のものがあります。
java ListAppuals.class java com / acme / example / ListAppuals.class
  • ケーシングを考慮する必要があります。Javaコマンドでは大文字と小文字が区別され、1文字でも間違えるとメインクラスをロードできなくなります。不適切な間違いの例は次のとおりです。
java com.acme.example.listappuals
  • あなたはいけません宣言したソースファイル名を。前述のように、クラスを正しい完全なクラス名形式で宣言するだけで済みます。間違いの例は次のとおりです。
java ListAppuals.java
  • このエラーは、タイプミスをしたり、クラス名を完全に書き忘れたりした場合にも発生します。

クラス名の宣言でずさんな間違いをした場合は、それを修正してからプログラムを起動してください。

解決策2:クラスパスを確認する

クラス名を正しく宣言してもエラーが表示される場合は、javaコマンドが指定されたクラス名をパスで見つけられなかった可能性があります。クラスパスは、Javaランタイムがリソースファイルとクラスファイルを検索するパスです。以下に示すように、2つの異なるコマンドを使用してクラスパスを簡単に設定できます。

C:> sdkTool -classpath classpath1; classpath2 ... C:> set CLASSPATH = classpath1; classpath2 ...

クラスパスについてさらに理解を深めるには、次のドキュメントをチェックしてください。

Javaコマンドのドキュメント

クラスパスの設定

解決策3:ディレクトリを確認する

ディレクトリをクラスパスとして宣言すると、常に名前空間のルートに対応します。たとえば、「/ usr / local / acme / classes」がクラスパス上にある場合、Javaはクラス「com.acme.example.Appuals」を検索します。次のパス名を持つクラスを探します。

/usr/local/acme/classes/com/acme/example/Appuals.class

So in essence, if you put the following address in the classpath, Java will not be able to find the class:

/usr/local/acme/classes/com/acme/example

You should also check your subdirectory and see if it matches the FQN. If your classes FQN is “com.acme.example.Appuals”, then Java will search for an “Appuals.class” in the directory “com/acme/example”.

To give you an example, let’s suppose the following scenario:

  • The class you want to run is: com.acme.example.Appuals
  • The full file path is: /usr/local/acme/classes/com/acme/example/Appuals.class
  • The current working directory is: /usr/local/acme/classes/com/acme/example/

Then the following scenarios would hold:

# wrong, FQN is needed java Appuals # wrong, there is no `com/acme/example` folder in the current working directory java com.acme.example.Appuals # wrong, similar to above scenario java -classpath . com.acme.example.Appuals # OK ; a relative classpath is set java -classpath ../../.. com.acme.example.Appuals # OK; an absolute classpath is set java -classpath /usr/local/acme/classes com.acme.example.Appuals

Note: The classpath needs to also include all the other classes (non-system) which your applications needs.

Solution 4: Checking class package

上記のすべての解決策が当てはまる場合、ソースコードが正しいフォルダーに配置されていることを確認する必要があります。また、パッケージを正しく宣言しました。IDEでコードを実行すると、おそらく問題について通知されます。ただし、私たちの場合、コマンドプロンプトで実行しているため、間違いは気付かれず、議論中のクラスエラーが発生します。