Javaアプレット(35) バグの発見

dの計算が思った通りになっていなかったので、dの計算が終わった165行目まで進めてみます。デバッグビューの[ステップ・オーバー]ボタンを使ってみましょう。
図:[ステップ・オーバー]ボタン
【図50 [ステップ・オーバー]ボタン】
1回押す毎に次の行へ進みます。3回押すと、165行目まで来ます。これでdの計算が終わっているはずです。
図:ステップ・オーバー後のエディタービュー
【図51 ステップ・オーバー後のエディタービュー】
ここでまずdの値を確認してみます。「式」ビューに「d.toString()」を追加してみます。dは期待される値t(1 0 0 0)になっていました。これにbの値t(0 1 1 1)の論理和を取れば、新しいb‘は期待通りt(1 1 1 1)となり、白石のあった要素1は0から1へ戻るはずです。
実際に165行も実行してみましょう。[ステップ・オーバー]ボタンを1回押します。ここで、さらにプログラムを進めるため、再開ボタンを押します。次にブレークポイントで止まるところまで進みます。結果を見るため「コンソール」ビューを見ます。
turn:B
(2,1)
#3
F’=
1 1 1 0
1 1 0 1
1 0 1 1
0 1 1 1
b’=(1 1 1 1
)
w’=(1 0 0 1
)
l=(1 0 0 1
)
h=(1 1 0 0
)
a=(1 0 0 1
)
d=(1 1 0 0
)
A=
0 0 0 0
0 0 0 0
1 0 1 1
0 0 0 0
D=
1 1 1 0
1 1 1 1
1 1 1 1
1 1 1 1
‘+@
‘@+
と、白石は取り除かれていました。どうやら結果を見間違えていたようです。結果の最後の部分の盤面図は正しく表示されているのに、の結果がt(1 1 0 0)と、さきほど「式」ビューで見た結果と違います。これは、プログラムが最後にこの結果を表示するときのバグのようです。
この出力は実はPosクラスのtoString()メソッドを使っています。つまりこのtoString()メソッドにバグが潜んでいたのです。問題の個所は、
str += “d=(” + h.toString() + “)\n”;
となっていました。strはPosのtoString()で返される文字列が入ります。dの出力なのに、hの内容を出力していました。正しくは、
str += “d=(” + d.toString() + “)\n”;
です。これを修正して改めてSample6の結果を見たところ、問題なさそうです。ということで、今度はSample5とJUnitテストセットPosTestの結果を見ていきましょう。
(つづく)

カテゴリーJava

コメントを残す