12/11 アプレットプログラミング,並行プログラミング(2)


前回までの補足


前回の課題について

12/11 16:00時点で11名しか提出していない.今日は講義時間を減らして自習 時間を増やすので,自習時間中になるべく質問するように.

プログラムを作っても動かない場合(大概すぐ動かない)は,プログラムのミ ス(バグ bug)を取り除くデバッグ(debug)作業が必要になる.デバッグの際に は,ありがちなバグを知っておくと良い.初心者のおかすミスをいくつかあげ る.

現象: すぐ終わるはずの処理がいつまでたっても終わらない.
よくある原因: プログラムのループの変数名が誤っている(重なっている).
例1
  for(i=0;i<100;i++){
    for(j=0;j<100;i++){
                  ^^^
      // 処理
    }
  }
例2
  for(i=0;i<100;i++){
    for(i=0;i<10;i++){
        ^^^^^^^^^^^^
      // 処理
    }
  }
余計なセミコロンが入っている
例3
  for(i=0;i<100;i++);{
   // 処理
  }
現象: 以下のような実行時エラーが出る.
Exception in thread "main" java.lang.NullPointerException
	at test.main(test.java:5)
初期化されていない(まだ代入をされたことのない)オブジェクト型の変 数は何もない仮想的なオブジェクト null を指している.この変数の値を参照 しようとすると,例外 java.lang.NullPointerException が発生する.このエ ラーが出る場合は,エラーの出た行(上の例では test.javaの5行目)に至る実 行経路(実行パス)の中でどこで値を入れたつもりだったのか確認すること.

簡単なデバッグ法は,いろいろなところに変数を表示する System.out.println文(本来の目的からはSystem.err.printlnの方が適当)を入 れることである.printlnは null も破綻せずに表示してくれる.

より高度なデバッグ法としては,

dell.tanaka.ecc.u-tokyo.ac.jp% javac -g test.java
のようにデバッグオプション付きでコンパイルしておいて,デバッガ jdb 上 でプログラムを動かすこともできる.
dell.tanaka.ecc.u-tokyo.ac.jp% jdb test
jdb の初期化中です...
> run
test を実行します
> 
VM が起動しました: test

例外が発生しました: java.lang.NullPointerException (キャッチされていません)"スレッド=main", test.main(), line=5 bci=12
5        soko.equals(null);

main[1] where
  [1] test.main (test.java:5)
main[1] print test.soko
 test.soko = null
ただし,アプレットの場合はこの方法が使えないので注意が必要となる.

この課題の締切りは12/18(火) 21:00 に延長する.


次に進む