Java での「Could Not Find or Load Main Class」エラーの解決方法

JavaJavaBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

Java プログラミングを学ぶ際には、さまざまなエラーや例外に遭遇することは避けられません。多くの初心者が直面する一般的なエラーの 1 つに、「Could Not Find or Load Main Class」エラーがあります。このエラーは、Java 仮想マシン (JVM) が、アプリケーションのエントリーポイントとなる main メソッドを含むクラスを見つけられないか、ロードできない場合に発生します。

この実験では、このエラーの一般的な原因を調べ、解決するためのさまざまなアプローチを学びます。このエラーの根本的な理由を理解することで、将来の Java プログラミングの試みで同様の問題をより適切に処理できるようになります。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/ConcurrentandNetworkProgrammingGroup(["Concurrent and Network Programming"]) java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/FileandIOManagementGroup(["File and I/O Management"]) java/BasicSyntaxGroup -.-> java/output("Output") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("Classes/Objects") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/packages_api("Packages / API") java/FileandIOManagementGroup -.-> java/files("Files") java/FileandIOManagementGroup -.-> java/io("IO") java/ConcurrentandNetworkProgrammingGroup -.-> java/working("Working") subgraph Lab Skills java/output -.-> lab-117401{{"Java での「Could Not Find or Load Main Class」エラーの解決方法"}} java/classes_objects -.-> lab-117401{{"Java での「Could Not Find or Load Main Class」エラーの解決方法"}} java/packages_api -.-> lab-117401{{"Java での「Could Not Find or Load Main Class」エラーの解決方法"}} java/files -.-> lab-117401{{"Java での「Could Not Find or Load Main Class」エラーの解決方法"}} java/io -.-> lab-117401{{"Java での「Could Not Find or Load Main Class」エラーの解決方法"}} java/working -.-> lab-117401{{"Java での「Could Not Find or Load Main Class」エラーの解決方法"}} end

シンプルな Java プログラムを作成する

このステップでは、Java のコンパイルと実行の基本を理解するために、シンプルな Java プログラムを作成します。

  1. まず、新しい Java ファイルを作成しましょう。WebIDE で、プロジェクトディレクトリ (~/project) に移動し、HelloWorld.java という名前の新しいファイルを作成します。

  2. HelloWorld.java ファイルに以下のコードを追加します。

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, Java World!");
    }
}

このコードが何をするかを理解しましょう。

  • public class HelloWorldHelloWorld という名前のパブリッククラスを定義します。
  • public static void main(String[] args):Java アプリケーションのエントリーポイントである main メソッドを定義します。
  • System.out.println("Hello, Java World!"):コンソールに「Hello, Java World!」というテキストを出力します。

最も重要な点は、クラス名 (HelloWorld) がファイル名 (HelloWorld.java) と一致していることです。この命名規則は Java では非常に重要であり、これに従わないことが「Could Not Find or Load Main Class」エラーの一般的な原因の 1 つです。

  1. Ctrl+S を押すか、メニューから「ファイル」>「保存」を選択して、ファイルを保存します。

Java プログラムをコンパイルして実行する

これで Java プログラムを作成したので、コンパイルして実行する必要があります。Java でのコンパイルは、人間が読めるコード(ソースコード)を Java 仮想マシン (JVM) が理解できるバイトコードに変換します。

  1. メニューから「ターミナル」>「新しいターミナル」をクリックして、WebIDE でターミナルを開きます(まだ開いていない場合)。

  2. 正しいディレクトリにいることを確認します。

cd ~/project
  1. javac コマンドを使用して Java プログラムをコンパイルします。
javac HelloWorld.java

何も出力がない場合、コンパイルは成功したことを意味します。コンパイルプロセスでは、同じディレクトリに HelloWorld.class という名前のファイルが作成されます。この .class ファイルには、JVM が実行できるバイトコードが含まれています。

このファイルが作成されたことを、ディレクトリの内容を一覧表示することで確認できます。

ls

出力に HelloWorld.javaHelloWorld.class の両方のファイルが表示されるはずです。

HelloWorld.class  HelloWorld.java
  1. java コマンドを使用してコンパイルされたプログラムを実行します。
java HelloWorld

以下の出力が表示されるはずです。

Hello, Java World!

これは、プログラムが正常にコンパイルされて実行されたことを示しています。

次のステップで「Could Not Find or Load Main Class」エラーを調べる前に、この基本的なワークフローを理解することが重要です。

「Could Not Find or Load Main Class」エラーの理解

これで Java プログラムのコンパイルと実行の基本を理解したので、「Could Not Find or Load Main Class」エラーとその一般的な原因を調べてみましょう。

エラーシナリオ 1: クラス名の不一致

このエラーの最も一般的な原因の 1 つは、コード内のクラス名とファイル名が一致していないことです。

  1. 以下の内容で NameMismatch.java という名前の新しいファイルを作成します。
public class IncorrectName {
    public static void main(String[] args) {
        System.out.println("This program will cause an error!");
    }
}

クラス名 (IncorrectName) がファイル名 (NameMismatch.java) と一致していないことに注意してください。

  1. このファイルをコンパイルしてみましょう。
javac NameMismatch.java

コンパイルは成功するはずですが、IncorrectName.class という名前のファイルが作成されます(ファイル名ではなくクラス名に一致します)。

  1. 次に、ファイル名を使用してプログラムを実行してみましょう。
java NameMismatch

以下のエラーが表示されます。

Error: Could not find or load main class NameMismatch
Caused by: java.lang.ClassNotFoundException: NameMismatch
  1. このエラーを修正するには、正しいクラス名を使用してプログラムを実行する必要があります。
java IncorrectName

これで以下の出力が表示されるはずです。

This program will cause an error!

エラーシナリオ 2: 誤ったディレクトリからの実行

もう 1 つの一般的な原因は、コンパイルされた .class ファイルが含まれていないディレクトリから Java クラスを実行しようとすることです。

  1. このデモンストレーション用にサブディレクトリを作成します。
mkdir subdirectory
  1. この新しいディレクトリに移動します。
cd subdirectory
  1. このディレクトリから HelloWorld プログラムを実行してみましょう。
java HelloWorld

以下のエラーが表示されます。

Error: Could not find or load main class HelloWorld
Caused by: java.lang.ClassNotFoundException: HelloWorld
  1. このエラーを修正するには、次のいずれかの方法を試します。

    • .class ファイルが含まれているディレクトリに戻ります。
    cd ..
    java HelloWorld
    • または、クラスファイルの完全なパスを指定します(ステップ 5 で説明します)

次のステップのために、プロジェクトディレクトリに戻ります。

cd ~/project

Java パッケージの使用

Java のパッケージは、クラスを名前空間に整理するために使用されます。パッケージは、名前の衝突を防ぎ、アクセス制御を提供することで、大規模なアプリケーションを管理するのに役立ちます。ただし、パッケージを誤って使用すると、「Could Not Find or Load Main Class」エラーが発生することもあります。

パッケージ構造の理解

  1. まず、パッケージのディレクトリ構造を作成しましょう。Java では、パッケージ構造はディレクトリ構造と一致する必要があります。
mkdir -p ~/project/com/example
  1. com/example ディレクトリ内に PackagedClass.java という名前の新しい Java ファイルを作成します。
cd ~/project/com/example
  1. PackagedClass.java に以下のコードを追加します。
package com.example;

public class PackagedClass {
    public static void main(String[] args) {
        System.out.println("This class is in a package!");
    }
}

ファイルの先頭にある package com.example; 宣言に注意してください。これは、このクラスが com.example パッケージに属していることを Java に伝えます。

  1. プロジェクトディレクトリに戻り、ファイルをコンパイルします。
cd ~/project
javac com/example/PackagedClass.java
  1. クラス名のみを使用してクラスを実行しようとすると、エラーが発生します。
java PackagedClass

出力:

Error: Could not find or load main class PackagedClass
Caused by: java.lang.ClassNotFoundException: PackagedClass
  1. パッケージ内のクラスを実行する正しい方法は、完全修飾クラス名(パッケージを含む)を使用することです。
java com.example.PackagedClass

これで以下の出力が表示されるはずです。

This class is in a package!

パッケージに関する重要なポイント

  • パッケージ宣言はファイル内の最初の文でなければなりません。
  • ディレクトリ構造はパッケージ構造と一致しなければなりません。
  • パッケージ化されたクラスを実行するときは、完全修飾クラス名を使用する必要があります。
  • コンパイルコマンドにはソースファイルへのパスを含める必要がありますが、実行コマンドではファイルパスではなくパッケージとクラス名を使用する必要があります。

このパッケージシステムは、特に大規模なアプリケーションの Java 開発において基本的な要素です。

クラスパスを使用してクラスロードの問題を解決する

クラスパスは、Java 仮想マシン (JVM) にクラスやパッケージを探す場所を教えるパラメータです。クラスパスの使い方を理解することは、特に複雑なプロジェクトにおいて「Could Not Find or Load Main Class」エラーを解決するために不可欠です。

クラスパスとは何か?

クラスパスは、クラスファイルを含むディレクトリ、JAR ファイル、および ZIP ファイルのリストです。JVM は、このリストを使用して、プログラムをロードおよび実行する際にクラスを検索します。

クラスパスパラメータの使用

クラスパスの使用方法をデモンストレーションするために、新しいディレクトリ構造を作成しましょう。

  1. コンパイルされたクラス用の新しいディレクトリを作成します。
mkdir -p ~/project/classes
  1. プロジェクトディレクトリに ClasspathDemo.java という名前の新しい Java ファイルを作成します。
public class ClasspathDemo {
    public static void main(String[] args) {
        System.out.println("Successfully loaded class using classpath!");
    }
}
  1. Java ファイルをコンパイルし、.class ファイルを classes ディレクトリに配置するよう指定します。
javac -d classes ClasspathDemo.java

-d オプションは、コンパイルされたクラスファイルの出力先ディレクトリを指定します。指定したディレクトリにクラスファイルが作成されたことを確認できます。

ls classes

以下のように表示されるはずです。

ClasspathDemo.class
  1. クラスパスを指定せずにプログラムを実行してみましょう。
java ClasspathDemo

以下のエラーが表示されます。

Error: Could not find or load main class ClasspathDemo
Caused by: java.lang.ClassNotFoundException: ClasspathDemo
  1. このエラーを修正するには、プログラムを実行する際にクラスパスを指定する必要があります。
java -classpath classes ClasspathDemo

または、短縮形の -cp オプションを使用することもできます。

java -cp classes ClasspathDemo

これで以下の出力が表示されるはずです。

Successfully loaded class using classpath!

クラスパス環境変数の設定

Java プログラムを実行するたびにクラスパスを指定する代わりに、CLASSPATH 環境変数を設定することができます。

export CLASSPATH=~/project/classes:$CLASSPATH

この環境変数を設定した後は、-classpath オプションなしでプログラムを実行できます。

java ClasspathDemo

同じ出力が表示されるはずです。

Successfully loaded class using classpath!

クラスパスを使用するタイミング

以下の場合にクラスパスを使用する必要があります。

  • クラスが現在のディレクトリにない場合
  • サードパーティのライブラリ (JAR ファイル) を使用している場合
  • 複数のソースディレクトリを持つ複雑なプロジェクト構造の場合
  • Maven や Gradle などのビルドツールを使用している場合 (これらのツールがクラスパスを管理します)

クラスパスの理解は、単純な単一ファイルのプログラムを超えた Java 開発において重要であり、複雑な設定での「Could Not Find or Load Main Class」エラーの解決策になることが多いです。

まとめ

この実験を通じて、Java でよく発生する「Could Not Find or Load Main Class」エラーを調査し、それを解決するいくつかの方法を学びました。以下に、ここまでの内容をまとめます。

  1. 基本的な Java のコンパイルと実行javacjava コマンドを使用して、簡単な Java プログラムを作成、コンパイル、実行する方法を学びました。

  2. 一般的なエラーの原因

    • コード内のクラス名とファイル名が一致しない
    • 間違ったディレクトリから実行する
    • パッケージの使用方法が誤っている
    • クラスパスの問題
  3. パッケージの使用:Java でのパッケージの仕組みを調査しました。これには、パッケージ構造とディレクトリ構造の関係、およびパッケージ化されたクラスを適切に実行する方法が含まれます。

  4. クラスパスの使用:クラスパスオプションを使用して、JVM にクラスの場所を指定する方法を学びました。これは、複雑なプロジェクトで特に役立ちます。

「Could Not Find or Load Main Class」エラーは最初はイライラするかもしれませんが、その原因を理解することで、診断と修正がはるかに簡単になります。以下の重要なポイントを覚えておいてください。

  • コード内のクラス名は、ファイル名(.java 拡張子を除く)と一致しなければなりません。
  • パッケージを使用する場合、ディレクトリ構造はパッケージ構造と一致しなければなりません。
  • 常に正しいディレクトリから Java プログラムを実行するか、クラスパスを使用してクラスの場所を指定してください。
  • パッケージ化されたクラスの場合、プログラムを実行するときに完全修飾クラス名(パッケージを含む)を使用してください。

これらの概念を習得することで、Java 開発の過程でこの一般的なエラーを回避または迅速に解決することができます。