コンパイラの問題

Microsoft Windowsシステムでの一般的なエラー・メッセージ

'javac' is not recognized as an internal or external command, operable program or batch file

このエラーが発生した場合、Windowsでコンパイラ(javac)を見つけることができません。

Windowsにjavacの検索場所を認識させる方法は次のとおりです。 JDKをC:\jdk6にインストールしている場合、 プロンプトで、次のコマンドを入力して[Enter]キーを押します。 C:\jdk6\bin\javac HelloWorldApp.java この方法を選択した場合、プログラムのコンパイルまたは実行のたびに、javacコマンドおよびjavaコマンドの前にC:\jdk6\bin\を付加する必要があります。 この入力を省略する方法については、JDK 6のインストール手順のセクションを確認してください。

Class names, 'HelloWorldApp', are only accepted if annotation processing is explicitly requested

このエラーが発生した場合、プログラムのコンパイル時に.java拡張子を含めることを忘れています。 コマンドはjavac HelloWorldApp.javaであり、javac HelloWorldAppではないことを覚えておいてください。 UNIXシステムでの一般的なエラー・メッセージ

javac: Command not found

このエラーが発生した場合、UNIXでコンパイラ(javac)を見つけることができません。

UNIXにjavacの検索場所を認識させる方法は次のとおりです。 JDKを/usr/local/jdk6にインストールしている場合、 プロンプトで、次のコマンドを入力して[Return]キーを押します。 /usr/local/jdk6/javac HelloWorldApp.java 注: この方法を選択した場合、プログラムのコンパイルまたは実行のたびに、javacコマンドおよびjavaコマンドの前に/usr/local/jdk6/を付加する必要があります。 この入力を省略するには、この情報をPATH変数に追加します。 これを行う手順は、現在実行しているシェルによって異なります。

Class names, 'HelloWorldApp', are only accepted if annotation processing is explicitly requested

このエラーが発生した場合、プログラムのコンパイル時に.java拡張子を含めることを忘れています。 コマンドはjavac HelloWorldApp.javaであり、javac HelloWorldAppではないことを覚えておいてください。

構文エラー(すべてのプラットフォーム)

プログラムの一部の入力を誤ると、コンパイラで構文エラーが発生することがあります。 メッセージには通常、エラーの種類、エラーが検出された行番号、その行のコード、そのコード内部のエラーの発生位置が表示されます。 文の最後のセミコロン(;)が足りないために発生するエラーは次のとおりです。 testing.java:14: `;' expected. System.out.println("Input has " + count + " chars.") ^ 1 error エラーが複数の行にわたって次々に発生している場合、コンパイラでプログラマーの意図を推測できず、わかりづらいエラー・メッセージや複数のエラー・メッセージが出力されることがあります。 たとえば、次のコードでは、太字の行でセミコロン(;)が足りません。 while (System.in.read() != -1) count++ System.out.println("Input has " + count + " chars."); このコードを処理すると、コンパイラで次の2つのエラー・メッセージが発生します。 testing.java:13: Invalid type expression. count++ ^ testing.java:14: Invalid declaration. System.out.println("Input has " + count + " chars."); ^ 2 errors count++を処理した後、コンパイラの状態はcount++が式の途中にあることを表すので、コンパイラは2つのエラー・メッセージを発行します。 セミコロンがないと、コンパイラで文の終了を把握する手段はありません。

何らかのコンパイラ・エラーが発生した場合、プログラムのコンパイルは失敗し、.classファイルは作成されません。 プログラムをよく確認し、見つけたエラーを修正して、再度コンパイルしてください。

セマンティック・エラー

コンパイラでは、プログラムの構文の正確性の確認に加えて、他の基本的な正確性もチェックされます。 たとえば、初期化されていない変数を使用している場合、そのたびに警告が表示されます。 testing.java:13: Variable count may not have been initialized. count++ ^ testing.java:14: Variable count may not have been initialized. System.out.println("Input has " + count + " chars."); ^ 2 errors この場合も、プログラムのコンパイルは失敗し、.classファイルは作成されません。 エラーを修正し、再度コンパイルしてください。

実行時の問題

Microsoft Windowsシステムでのエラー・メッセージ

Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorldApp

このエラーが発生した場合、javaは、バイトコード・ファイルHelloWorldApp.classを参照できていません。

java.classファイルの検索を試みる場所の1つは、現在のディレクトリです。 このため、.classファイルがC:\javaにある場合、現在のディレクトリをそのディレクトリに変更する必要があります。 ディレクトリを変更するには、プロンプトで次のコマンドを入力して[Enter]キーを押します。

cd c:\java

プロンプトがC:\java>に変更されます。 プロンプトでdirと入力すると、.javaファイルと.classファイルが表示されます。 この状態で、再度java HelloWorldAppと入力します。

まだ問題が発生する場合は、CLASSPATH変数の変更が必要となる可能性があります。 この変更が必要かどうかを確認するには、次のコマンドでクラスパスを上書きしてください。

set CLASSPATH=

この状態で、再度java HelloWorldAppと入力します。 プログラムが動作するようになった場合は、CLASSPATH変数を変更する必要があります。 この変数の設定方法については、 JDK 6インストール手順で該当するセクションを参照してください。 同じ方法でCLASSPATH変数を設定します。

Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorldApp/class

初心者プログラマーによくある失敗は、コンパイラによって作成された.classファイルに対してjavaランチャを実行しようとすることです。 たとえば、java HelloWorldAppではなくjava HelloWorldApp.classでプログラムの実行を試みると、このエラーが発生します。 引数は使用するクラス名であり、ファイル名ではないことを覚えておいてください。

Exception in thread "main" java.lang.NoSuchMethodError: main

Java VMでは、実行するクラスに、アプリケーションの実行を開始する場所を示すmainメソッドが含まれている必要があります。 "Hello World!"アプリケーションの詳細セクションで、mainメソッドについて詳しく説明しています。

UNIXシステムでのエラー・メッセージ

Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorldApp

このエラーが発生した場合、javaは、バイトコード・ファイルHelloWorldApp.classを参照できていません。

javaがバイトコード・ファイルの検索を試みる場所の1つは、現在のディレクトリです。 このため、たとえばバイトコード・ファイルが/home/jdoe/javaにある場合、現在のディレクトリをそのディレクトリに変更する必要があります。 ディレクトリを変更するには、プロンプトで次のコマンドを入力して[Return]キーを押します。

cd /home/jdoe/java

プロンプトでpwdと入力すると、/home/jdoe/javaが表示されます。 プロンプトでlsと入力すると、.javaファイルと.classファイルが表示されます。 この状態で、再度java HelloWorldAppと入力します。

まだ問題が発生する場合は、CLASSPATH環境変数の変更が必要となる可能性があります。 この変更が必要かどうかを確認するには、次のコマンドでクラスパスを上書きしてください。

unset CLASSPATH

この状態で、再度java HelloWorldAppと入力します。 プログラムが動作するようになった場合は、上述のPATH変数と同じ方法でCLASSPATH変数を変更する必要があります。

Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorldApp/class

初心者プログラマーによくある失敗は、コンパイラによって作成された.classファイルに対してjavaランチャを実行しようとすることです。 たとえば、java HelloWorldAppではなくjava HelloWorldApp.classでプログラムの実行を試みると、このエラーが発生します。 引数は使用するクラス名であり、ファイル名ではないことを覚えておいてください。

Exception in thread "main" java.lang.NoSuchMethodError: main

Java VMでは、実行するクラスに、アプリケーションの実行を開始する場所を示すmainメソッドが含まれている必要があります。 "Hello World!"アプリケーションの詳細セクションで、mainメソッドについて詳しく説明しています。