Javaに関する様々な情報をご紹介します。

1コンパイル時のエラー

Javaに関する様々な情報をご紹介します。

コンパイル時のエラー

コンパイル時にエラーが出る

EclipseNetBeansJDeveloperなどの無料のIDE(統合開発環境)を活用しましょう。これらの開発ツールは、コンパイル前にエラー箇所を検知し、教えてくれます。また、エラー内容によっては、修正案も提示してくれます。Javaでの開発効率が飛躍的に向上します。

'javac' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチファイルとして認識されていません。

JDKのPATHが設定されていません。JDKインストール後、環境変数のPATHに適切な値を設定します。

エラー: HelloWorld.java を読み込めません。

コンパイル対象のHelloWorld.javaというファイルが認識できない(読み込めない)時に表示されるエラーです。 主な原因として、以下のようなものがあります。

  • ファイル名は間違っていませんか。大文字小文字も区別されます。
  • ファイルの拡張子は.javaですか。Windowsでは、デフォルトで拡張子を表示しないようになっています。エクスプローラーの「ツール」→「フォルダオプション」→「表示」で「登録されている拡張子は表示しない」のチェックを外し、拡張子が.javaになっているか確認しましょう。
  • javacコマンドを実行したディレクトリにHelloWorld.javaファイルは存在しますか。ファイルが存在する場合は、クラスパスは正しく設定されていますか。
    クラスパスがわからない場合は、とりあえず、HelloWorld.javaファイルが存在するディレクトリで「javac -classpath . HelloWorld.java」を実行してみましょう(.(ピリオド)を忘れずに)。

Test.java:1: クラス HelloWorld は public であり、ファイル HelloWorld.java で宣言しなければなりません。

C:\Java\source\TEST>javac Test.java
Test.java:1: クラス HelloWorld は public であり、ファイル HelloWorld.java で宣言 しなければなりません。
public class HelloWorld {
     ^
エラー 1 個

publicなクラスのクラス名とファイル名が異なる場合に表示されるエラーです。publicなクラスがある場合は、ファイル名はクラス名と一致している必要があります。
例では、クラス名がHelloWorldであるのに対し、ファイル名がTest.javaとなっていることを表します。

シンボルを見つけられません。

C:\Java\source\TEST>javac Test.java
Test.java:3: シンボルを見つけられません。
シンボル: クラス Date
場所   : Test の クラス
   System.out.println(new Date());
                  ^
エラー 1 個

コンパイラがクラス、メソッドなどを見つけられなかった時に表示されるエラーです。エラーの「シンボル:」の箇所に記載されているものが見つけられなかったものです。例では、クラスDateが見つけられなかったことを表します。主な原因として以下のようなものがあります。

  • 必要なクラスはimportされていますか。
  • クラスパスは正しく設定されていますか。
  • クラス、メソッド、変数などのスペルミスはありませんか。
  • 見つからなかったものがメソッドの場合、呼出先と呼出元のメソッドのタイプ(引数の数、型など)が一致しているか確認しましょう。
  • 見つからなかったものが変数の場合、その変数が参照可能かアクセスレベルを確認しましょう。

推奨されない API を使用またはオーバーライドしています。

C:\Java\source\TEST>javac Test.java
注:Test.java は推奨されない API を使用またはオーバーライドしています。
注:詳細については、-Xlint:deprecation オプションを指定して再コンパイルしてくださ い。

推奨されなくなったAPIを使用しているときに表示される警告です。-Xlint:deprecationオプションを付与して再コンパイルすることで詳細な警告箇所を確認することができます。
警告のため、コンパイル自体は行われています。しかし、修正が可能な場合は、推奨されなくなったAPIを使用しないように修正すべきです。

static でない ○○○ を static コンテキストから参照することはできません。

staticなメソッドからstaticでないメソッド、変数を参照したときに表示されるエラーです。static修飾子が付与されたメソッドはクラスに属するメソッドです。static修飾子が付与されていないメソッドはクラスのオブジェクトに属するメソッドです。

static修飾子が付与されていないメソッドで、明示的にオブジェクトを指定せずメソッド、変数を参照した場合は、暗黙的にthisが付与されます。static修飾子が付与されたメソッドで、明示的にオブジェクトを指定せずメソッド、変数を参照した場合は、クラスに属するメソッドのため、暗黙的にthisを付与できずエラーとなります。 明示的にオブジェクトを指定してメソッド、変数を参照すれば、エラーにはなりません。

エラーが生成される例

public class Test {
    public static void main(String[] args) {
        //staticなメソッドから明示的にオブジェクトを指定せず、
        //staticでないメソッドを呼び出すことはできない。
        show();
    }
    void show(){
        System.out.println("Hello!");
    }
}

エラーが生成されない例

public class Test {
    public static void main(String[] args) {
        //明示的にオブジェクトを指定した場合は、
        //staticでないメソッドを呼び出すことができる。
        Test object1 = new Test();
        object1.show();
    }
    void show(){
        System.out.println("Hello!");
    }
}

return 文が指定されていません。

void以外のメソッドでreturn文が必要な箇所にretrun文がない場合に発生するエラーです。主に以下のようなケースで発生します。

  • 戻り型がvoid以外のメソッドで適切なreturn文が指定されていない場合。
  • if ~ else if文で、if節もしくは、else if節にreturn文がある場合。この場合は、プログラムにもよりますが、else節を記述し、そこにもreturn文を記述することでエラーを解決できます。
  • switch文で、case節にreturn文があるが、default節にreturn文がない場合。この場合は、プログラムにもよりますが、default節にreturn文を記述することでエラーを解決できます。
  • try ~ catch文で、try節にreturn文があるが、catch節にreturn文がない場合。この場合は、プログラムにもよりますが、finally節を記述し、そこにreturn文を記述することでエラーを解決できます。

エラーが発生する例

public class Test {
    public static void main(String[] args) {
        int num1 = Integer.parseInt(args[0]);
        Test object1 = new Test();
        System.out.println(object1.calc(num1));
    }
    boolean calc(int c) {
        if ( c >= 10 ) {
            return true;
        //else節がないため、コンパイラがすべての条件を満たす場合で
        //return文を記述していないと判断し、エラーが発生します。
        } else if ( c < 10 ) {
            return false;
        }
    }
}

エラーが発生しない例

public class Test {
    public static void main(String[] args) {
        int num1 = Integer.parseInt(args[0]);
        Test object1 = new Test();
        System.out.println(object1.calc(num1));
    }
    boolean calc(int c) {
        if ( c >= 10 ) {
            return true;
        //else節が記述されており、コンパイラがすべての条件を満たす場合で
        //return文が記述されていると判断するので、エラーは発生しません。
        } else {
            return false;
        }
    }
}

変数 ○○○ は初期化されていない可能性があります。

初期化されていない変数を参照した場合に発生するエラーです。
if文で変数を初期化している場合、try文で変数を初期化している場合などに、コンパイラが条件によっては初期化されない場合もあると判断して、エラーが発生しているケースが見られます。

public class Test {
    public static void main(String[] args) {
        int i = 10;
        String str;
        //もし、変数iが10未満の場合は変数strが初期化されないと
        //コンパイラが判断して、エラーが発生します。
        if (i >= 10) {
           str = "10以上です。";
        }
        System.out.println(str);
    }
}

例外 ○○○ は報告されません。スローするにはキャッチま たは、スロー宣言をしなければなりません。

例外処理を行う必要があるケースで、例外処理を行っていない場合に発生するエラーです。try ~ catch文で例外処理を記述するか、throwsで例外をスローする必要があります。

例外処理を行っていない例

FileWriter exFile = new FileWriter("exFile.txt");

例外処理を行っている例

//try ~ catch文で例外処理を行っています。
try {
    FileWriter exFile = new FileWriter("exFile.txt");
} catch (java.io.IOException e) {
    e.printStackTrace();
}

例外 ○○○ はすでにキャッチされています。

catch節を複数指定する場合に、継承関係を無視して指定している場合に発生するエラーです。catch節を複数指定する場合は、子孫クラスから順に記載する必要があります。スーパークラスを先に記載していた場合に、このエラーが発生します。

エラーが発生する例

try {
    FileWriter exFile = new FileWriter("exFile.txt");
    //スーパークラスであるIOExceptionを先に記載していますのでエラーが発生します。
} catch (java.io.IOException e) {
    e.printStackTrace();
} catch (java.io.FileNotFoundException e) {
    e.printStackTrace();
}

エラーが発生しない例

try {
    FileWriter exFile = new FileWriter("exFile.txt");
    //子孫クラスから順に記載していますのでエラーは発生しません。
} catch (java.io.FileNotFoundException e) {
    e.printStackTrace();
} catch (java.io.IOException e) {
    e.printStackTrace();
}

1コンパイル時のエラー