Previous | Next | Trail Map | Getting Started


コンパイラとインタプリタに関して起こりやすい問題(とその解決策)

Java ソースコードをコンパイルしたり、アプリケーションを実行する際のトラブルがある場合、おそらくこの節が役立つだろう。 この節の説明では十分でない場合は、使用しているコンパイラあるいはインタプリタの説明書を参照すること。

コンパイラの問題

Can't Locate the Compiler

UNIXシステムでは、パスが正確に設定されていない場合に、次のようなエラーメッセージを見ることがある。

javac: Command not found

setenv あるいは類似のコマンドを使用して、Java コンパイラのあるディレクトリが含まれるように、PATH 環境変数を変更する。

Syntax Errors

プログラムの一部をタイプミスした場合、コンパイラは構文エラーを発行することがある。 メッセージは通常、エラーの型、エラーが検出された行番号、その行のコード、およびそのコード内でのエラーの位置を表示する。 次は、文の終了においてセミコロン (;)を省略することによって起きたエラーである。

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++ を処理した後に、コンパイラの状態はそれが式の中央にあることを表すので、コンパイラは2つのエラーメッセージを発行する。 セミコロンがなくては、コンパイラは文が完全であることを知ることができない。 コンパイラエラーがある場合、プログラムは正常にコンパイルされず、コンパイラは .class ファイルを作成していない。 慎重にプログラムを検証して、検出したエラーを修正し、再度試みること。

Semantic Errors

プログラムが構文として正しいことの検証に加え、コンパイラは他の基本的なことが正しいかどうかも確認する。 例えば、コンパイラは初期化されていない変数を使用するたびに、警告を出す。

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 ファイルを作成しなかった。 エラーを修正して、再度試みること。

インタプリタの問題

Can't Find Class

UNIX あるいは Windows 95/NT JDK を使用している Java プログラマ初心者の頻出エラーは、コンパイラが作成する .class ファイルを解釈しようとすることである。 例えば、もし HelloWorldApp クラスではなく HelloWorldApp.class ファイルを解釈しようとすると、インタプリタは次のエラーメッセージを表示する。

Can't find class HelloWorldApp.class 

Java インタプリタへの引数は、使用したいクラス名であり、ファイル名ではない。

The main() Method Is Not Defined

Java インタプリタはそれを使用して実行するクラスが mainという名のメソッドを持つことを要求する。インタプリタは、どこか Java アプリケーションの実行を始める場所を得る必要があるからである。main() メソッド(in the Getting Started trail) では、main()メソッドについて詳細に説明する。

main()メソッドを持たない Java インタプリタを使用してクラスを実行しようとすると、インタプリタは次のエラーメッセージを出力する。

In class classname: void main(String argv[]) is not defined

上記のメッセージで、classname は実行しようとしたクラス名である。

Changes to My Program Didn't Take Effect

時々、編集/デバッグ/実行のサイクルにいるとき、print 文が出力しないなど、アプリケーションに対する変更が効力を発しないようにみえる。 これは、 Java Runner を使用している MacOS 上でJava アプリケーションを実行するときによく発生する。.class ファイルを再コンパイルする場合は、Java Runner がクラスを再ロードしないので、Java Runner を終了して再起動しなくてはならない。


Previous | Next | Trail Map | Getting Started