コンソールでの例外表示
前回紹介したように、Eclipseではコーディングだけでなく、実行まで行うことができます。ただし、その実行結果が期待通りとならないのが、プログラミングの常です。その際、どこがおかしいのかを突き止め、修正しなければなりません。
Javaの場合は、何か問題があった場合、多くは例外発生という形をとります。Eclipseでは、そのような例外はコンソールに表示されます。例えば、図1は要素数が4個の配列のインデックス4(5個目)にデータを代入するコードが記述されたJavaプログラムを実行したEclipseの画面です。
コンソールタブに、発生した例外が表示されています。発生した例外は以下の内容です。
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 4 out of bounds for length 4 at com.example.eclipse.firstjavaproject.ArrayWithException.main(ArrayWithException.java:10)
これら例外メッセージを元に、問題点を解決していくことができます。また、例外メッセージ中には、各Javaクラスでの例外が発生した箇所が記載されています。上記メッセージでは、2行目末尾の「ArrayWithException.java:10」が該当します。これがコンソールタブ上ではリンクになっており、クリックすることでソースコードの該当箇所をすぐに表示してくれます。この機能は、複数のクラスを利用したJavaコーディングでのデバッグでは便利な機能です。
ブレークポイントとデバッグ実行
前節で述べたように、例外が発生した場合、まずは例外の発生箇所およびその周辺のソースコードを確認し、原因を突き止めていきます。しかし、場合によってはなかなか原因がわからないこともあります。さらに、例外が発生せずに、実行結果が想定と違う場合もあります。その場合、Eclipseには便利な機能として、ブレークポイントとデバッグ実行というのがあります。それを次に紹介しておきましょう。
ブレークポイントとは
ブレークポイントとは、プログラムの実行中に、処理を一時停止する箇所のことです。
例えば、リスト1のJavaプログラムがあるとします。
package com.example.eclipse.firstjavaproject; public class CalcWithRand { public static void main(String[] args) { int num1 = (int) (Math.random() * 10); // (1) int num2 = (int) (Math.random() * 10); // (2) Addition add = new Addition(); // (3) int ans = add.plus(num1, num2); // (4) System.out.println("答えは" + ans); // (5) } }
簡単にプログラムの内容を説明すると、(1)と(2)で乱数を発生させ、変数num1とnum2とします。(3)と(4)で別のJavaクラスであるAdditionクラスにある足し算処理メソッドplus()を利用して、発生させた乱数の足し算処理を行います。その結果を(5)で表示させるというものです。このプログラムを実行し、その結果、例えば、答えが10と表示されたとします。
となると一体、num1とnum2はどういう値なのか、簡単にはわかりません。そこで、ブレークポイントに登場してもらいます。リスト1のソースコードが表示されている、Eclipseのエディタ領域の、行番号の左横の領域をダブルクリックします。図2では、リスト1の(3)の行(図2では7行目)をダブルクリックしています。
ダブルクリックした箇所に見えるの青いマークがブレークポイントです。ブレークポイントが付与されたソースコードは、実行時にその行を実行する手前で処理が一時停止します。ただし、通常の実行方法では一時停止にはなりません。
デバッグ実行
ブレークポイントで処理を一時停止させるためには、デバッグ実行をする必要があります。これは、パッケージエクスプローラー上の.javaファイルを右クリック、あるいはエディタ領域に表示されているソースコードを右クリックして表示されるメニューから、[実行]ではなく[デバッグ]を選択します(図3)。
ツールバーからデバッグ実行をする場合は、実行ボタン左横のデバッグ実行ボタンを利用します。単にデバッグ実行ボタンをクリックすると、直近に実行したアプリケーションをデバッグ実行します。もし、履歴リストから選択したい場合は、前回紹介した実行ボタン同様に、右横の▼をクリックすると、図4のメニューが表示されるので、そこから選択します。
デバッグパースペクティブと変数ビュー
実際にデバッグ実行をしてみましょう。すると、図5のダイアログが表示されます。
これは、デバッグパースペクティブへの切り替えを確認するダイアログです。図3の画面は、第1回に紹介したように、Javaコーディングに最適化されたJavaパースペクティブです。Eclipseでは、デバッグ実行に最適化されたデバッグパースペクティブというのも用意されており、デバッグ実行をすると、自動的にそのパースペクティブへの切り替えを確認するダイアログが表示されます。そのダイアログ上の[切り替え]ボタンをクリックすると、図6のデバッグパースペクティブが表示されます。
さらに、パースペクティブが切り替わるだけではなく、アプリケーションが実行され、処理がブレークポイントで一時停止された状態になっています。図6のエディタ領域の7行目が図7の通り緑色になっているのが確認できます。
この一時停止された状態で、右上の変数ビューを確認します(図8)。
変数num1とnum2の値がそれぞれ4と6であることが確認できます。また、8行目(リスト1では(4))の変数ansが変数ビューにはないことも確認できます。これは、この段階では、処理が6行目の終了段階、つまり、7行目の実行手前で一時停止されており、8行目まで到達していないことを物語っています。
変数の値の確認がデバッグの入り口
このような変数の確認は、もちろんSystem.out.println()を使って、標準出力にnum1とnum2を表示させればわかります。しかし、num1とnum2の値の確認のためだけに記述したSystem.out.println()の行を、値の確認後に削除しなければなりません。その削除し忘れがあれば、それはそれでアプリケーションとしては問題です。
一方、デバッグは変数の値の確認が基本となっています。変数の値を確認することで、問題解決の道が開けることが多々あります。そのような変数の値を確認するにあたって、元のソースコードに手を加えることなく行えるブレークポイントとデバッグ実行は最適な方法といえます。
続きの処理を行う再開ボタン
デバッグ実行で処理が一時停止した状態では、ツールバー左側に図9のボタン群が表示されています。
このうち、ボタン(再開ボタン)が処理を再開させるボタンです。このボタンをクリックすることで、一時停止された処理の続きが実行されます。一方、ボタンは停止ボタンであり、その名の通り、現在実行中のアプリケーションを強制終了します。