Javaアプリケーションのデバッグ(3)
ステップイン、ステップリターン、ステップオーバー
プログラムを1行ずつ実行するのがステップ実行です。Eclipseのステップ実行機能には「ステップイン」「ステップリターン」「ステップオーバー」があります。ステップインを実行すると、現在の行が呼び出しているメソッドがあればそこに入ります。ステップインしたメソッドから元に戻るにはステップリターンを選びます。ステップインする必要がなければ、ステップオーバーを実行することで次の行へ進みます。では、実際に試してみましょう。先ほどの状態から[ステップインのアイコン]をクリックします。
ステップインによって、この行が呼び出しているHelloFunc
クラスのコンストラクタ「new HelloFunc()
」に入りますので、HelloFunc
クラスを開いているエディタービューに現在行が示されます。
しかし、HelloFunc
クラスのコンストラクタは記述されていませんので、これ以上ステップインする意味はありません。先に進むためにステップリターンしましょう。[ステップリターンのアイコン]をクリックします。
ステップリターンによって、HelloDebug
クラスに戻ります。この行にはコンストラクタ「new HelloFunc()
」の後に、メソッドを実行する「.sumArray(i)
」がありますので、先ほどと同じ行が現在行になります。このメソッドに入るために、再度、ステップインしましょう。ステップインによって、HelloFunc
クラスを開いているエディタービューのsumArray
メソッドの中に現在行が移ります。
このメソッドをみると、整数配列p
が引数として使われていることが分かります。そこで、変数ビューで整数配列「p
」を開き、各要素の値を確認します。順に、6
、2
、4
になっています。
では、このメソッドの中で次の処理に進めつつ、配列p
の各要素の値の変化を確認しましょう。ステップオーバーを2度行います。
ステップオーバーを2度行うと、HelloFunc
クラスのsumArray
メソッドにあるfor文の繰返しが進み、配列p
の要素[0]
の値が変化していることが変数ビューで分かります。
つまり、sumArray
メソッドは受け取った配列の要素[0]
を足しこみに用いているので、呼び出し側に戻った時には、元の配列の要素[0]
の値が変わってしまっているわけです。これが「1+2+4=7
」ではなく「1+2+4=12
」が表示されてしまった理由でした。
このように、ブレークポイントの設定とステップ実行機能により、きめ細かいデバッグが可能になります。ただし、デバッグ対象ではないソースにステップインしないように注意しましょう。Javaのクラスライブラリのソースに入り込んでしまい、バグを見失う場合があります。また、今回は割愛しますが、変数ビューで変数の値を強制的に変更することもできます。例外的な処理をテストしたい場合に便利です。