Java error guide

初心者にとって、なれない言語のエラーほど厄介なものはありません。
このページでは Java でプログラムを作成する上で、代表的なエラーの見方と原因を説明します。

前田稔の超初心者のプログラム入門

代表的なエラーと対処の方法

  1. Programing の最後の砦となるのが Java の仕様書です。
    Java2 SDK, Standard Edition V1.4.0
    Java3D の仕様書(英語)です。
    Java3D Documentation 1.5.2
  2. まず Java のサンプルプログラムを動かして、実行環境が整ったことを確認して下さい。
    Java を動かす
  3. 最初に一度は経験するエラーです。
    クラス Button は public であり、ファイル Button.java で宣言しなければなりません。
    Java では「ファイル名とクラス名」を同じ名前にして下さい。
    ファイル名やソースコードは「大文字と小文字」を区別します。
    ファイル名は button.java なのですが、class 名が Button(正しくは button) になっています。
    public class Button extends Applet
  4. 一番良く発生するエラーでしょうか? (^_^;)
    Let.java の 13 行目で使われている System.out.printnl メソッドが見つかりません。
    正しくは System.out.println です。
        Let.java:13: シンボルを見つけられません。
        シンボル: メソッド printnl(java.lang.String)
        場所    : java.io.PrintStream の クラス
                        System.out.printnl("   c: " + c);
    		          ^
        
    同じメッセージなのですがメソッドの名前は合っています。
    この場合はメソッドは存在するのですが、引数に合致するメソッドが見つからないのです。
    正しくは println(" c: " + c); です。
        Let.java:14: シンボルを見つけられません。
        シンボル: メソッド println(java.lang.String,int)
        場所    : java.io.PrintStream の クラス
                        System.out.println("   c: ", c);
    		          ^
        
    同じメッセージなのですがメソッドの名前は合っているし、引数も合っています。 (?_?;
        Rand.java:5: シンボルを見つけられません。
        シンボル: クラス Random
        場所    : Rand の クラス
            {   Random  rand = new Random();    // 乱数の初期化;
                ^
        
    Random を使うときは java.util.Random; を import しなければなりません。
    import java.util.Random;
    始めの内は、原因の異なるこの種のエラーに振り回されるかも知れません。 (^_^;)
  5. j2sdk-1_4_0-doc-ja で Random を調べてみましょう。
    今回はクラス名と同じ名前のメソッドなので Random で検索します。
        クラス Random
        java.lang.Object
          |
          +--java.util.Random
        
    java.util.Random が import する名前です。
    import java.util.Random;
    続いて Random クラスの説明やコンストラクタの概要やメソッドの概要が続きます。
    メソッドでエラーが発生したときは、クラスの中で説明されているメソッドの概要を参照して下さい。
  6. 同様に System.out.println() を調べてみましょう。
    一般的に索引はクラス別になっていて、メソッドの名前では検索出来ません。
    今回は System で検索して、その中から out を調べます。
    java.lang 
    クラス System
     java.lang.Object
      |
      +--java.lang.System
    
    System の中から out を調べます。
    out
     public static final PrintStream out
        「標準」出力ストリームです。
        このストリームはすでに開いていて、出力データの受け取りが可能です。
        通常、このストリームはディスプレイ出力、またはホスト環境やユーザによって指定されるその他の出力先と一致しています。
        単純なスタンドアロンの Java アプリケーションにおいて、出力データの行を書き込む一般的な方法は以下のとおりです。 
    
            System.out.println(data)
      
        PrintStream クラスの println メソッドを参照してください。 
        関連項目:
            PrintStream.println(), PrintStream.println(boolean), PrintStream.println(char), PrintStream.println(char[]),
            PrintStream.println(double), PrintStream.println(float), PrintStream.println(int), PrintStream.println(long), 
            PrintStream.println(java.lang.Object), PrintStream.println(java.lang.String) 
    
    関連項目から PrintStream.println() を選択して下さい。
    println
     public void println()
        行区切り文字列を書き込むことによって、現在の行を終了します。
        この行区切り文字列はシステムプロパティ line.separator により定義され、必ずしも単一の改行文字 ('\n') である必要はありません。
    
    --------------------------------------------------------------------------------
    
    println
     public void println(boolean x)
        boolean 値を出力して、行を終了します。
        このメソッドは、print(boolean) を呼び出してから println() を呼び出すのと同じように動作します。
     
        パラメータ:
            x - 出力される boolean 値
    
    --------------------------------------------------------------------------------
    以下 println(char x) が続きます。
        ・・・
    
  7. 実行する Class が見つからないときに表示されるメッセージです。
    ファイル名は Print.java なのに class print になっています。(P が小文字になっている)
    at で続くのはエラーが発生したクラス名とクラスを呼び出した行番号ですが、ほとんどがシステムの内部なので役に立ちません。
    自分で作成したクラス名が表示されたら、その行番号を手掛かりにエラーの原因を調べて下さい。
        C:\DATA\Java2\01Dos\01LetIf>java Print
        Exception in thread "main" java.lang.NoClassDefFoundError: Print (wrong name: print)
            at java.lang.ClassLoader.defineClass1(Native Method)
            at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
            at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
                ・・・
        
  8. 配列の添え字が範囲外を参照したときに表示されるメッセージです。
    今回は oserocls の中の Check() メソッドの 152 行目でエラーが発生していました。
        C:\DATA\JavaAP\17Osero>appletviewer osero.htm
        Exception in thread "AWT-EventQueue-1" java.lang.ArrayIndexOutOfBoundsException
            at oserocls.Check(osero.java:152)
            at oserocls.Search(osero.java:134)
                ・・・
        
  9. 実体が定義されていない Class や構造体を参照したときに表示されるメッセージです。
    今回は oserocls の中の Search() メソッドの 135 行目でエラーが発生していました。
        C:\DATA\JavaAP\17Osero>appletviewer osero.htm
        Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException
            at oserocls.Search(osero.java:135)
            at oserocls.Check_Play(osero.java:110)
            at osero.mouseClicked(osero.java:31)
                ・・・
        
    Class や構造体は new で実体を確保しなければなりません。
    Class の基礎です 及び 構造体(Class) を定義する を参照して下さい。
  10. Java では Windows Program でも Java3D でも Java Applet でも System.out.print() メソッドが使えます。
    デバッグに必要な情報は、これを使って収集して下さい。
    System.out.print のメッセージはコンソール画面に表示されます。
  11. Java ではガベージコレクション(garbage collection)が起動して、プログラムが動的に確保したメモリ領域のうち、不要になった領域を自動的に解放します。
  12. Jcpad の設定を使うと便利なのですが、組み込まれているクラスファイルのエラーに注意して下さい。
    組み込まれているクラスファイルにエラーが発生しても、翻訳済みのもの(.class)があればエラーにならずに、それが使われます。
    クラスファイルを修正するときは、翻訳済みの .class を削除するか、または単独で先にコンパイルして下さい。
    単独でコンパイルしてエラーが発生すれば、エラーダイアログが表示されます。
    メニューから「ファイル/ファイルを開く」で複数のファイルを同時に表示することが出来ます。
    また Jcpad のコマンド BOX を使ってコマンドプロンプトと同じように操作することも出来ます。
    MainClass.java の翻訳に先だって、コマンド BOX から GcmLcmClass.java を翻訳してみました。

  13. Java では過去に使われていた機能(書き方)で、将来は廃止される方向のものがあります。
    警告なので無視すれば「大抵の場合動く」のですが、場合によっては支障をきたすことがあります。
    また、将来のことを考えると対処した方が良いに決まっています。
        注:button.java は推奨されない API を使用またはオーバーライドしています。
        注:詳細については、-Xlint:deprecation オプションを指定して再コンパイルしてください。
        
    今回 button.java で発生した例です。
    コマンドラインから、次のコマンドを実行します。
        javac button.java -Xlint:deprecation
        
    次のメッセージが表示されました。
    C:\DATA\JavaAP\08Tool\01Button>javac button.java -Xlint:deprecation
    button.java:16: 警告:[deprecation] java.awt.Component の action(java.awt.Event,j
    ava.lang.Object) は推奨されません。
            public boolean action(Event e, Object obj)
                           ^
    警告 1 個
    
    Java の仕様書で Component を調べると次の記述が見つかりました。
    boolean action(Event evt, Object what) 
        推奨されていません。
        JDK バージョン 1.1 以降は、このコンポーネントをアクションイベントを開始する
        コンポーネントの ActionListener として登録する必要があります。 
    
    修正後の button を使うプログラムは Button を使う を参照して下さい。
  14. implements で ChangeListener を実装したときのエラーです。
    CheckGroup.java:6: CheckGroup は abstract でなく、javax.swing.event.ChangeListener 内の
    abstract メソッド stateChanged(javax.swing.event.ChangeEvent) をオーバーライドしません。
    class CheckGroup extends JFrame implements ChangeListener
    
    ChangeListener を実装するときは stateChanged(ChangeEvent e) の実体を定義しなければなりません。
    implements の説明は interface(implements)の基礎 を参照して下さい。
    サンプルプログラムは CheckBox を使う を参照して下さい。
  15. いくら調べても原因が解らないときは、Class や変数の名前を疑ってみて下さい。
    Java で使われている名前と競合すると、意味不明のメッセージや現象がおこることがあります。
  16. Java 3D の環境と、セットアップに関するエラーは Java 3D のセットアップ を参照して下さい。

超初心者のプログラム入門(Java2)