Javaでプログラミングを行う際、自分の書いたコードがエラーなしでいきなり動くなんてことはほとんどありません。
そこでエラー箇所を特定するために重要な役割を担うのが「デバッグ実行」です。
本記事では、Java開発を効率化させるためには必ずマスターしたいデバッグ実行の方法について、人気開発環境であるEclipse上での操作方法を掲載しながらご紹介していきます。
目次
Javaのデバッグ実行とは
そもそもデバッグとは何かについてですが、プログラミング中に紛れた不具合箇所を特定し取り除く作業のことをデバッグと呼びます。
デバッグ自体は様々な方法で実現出来るのですが、Javaのようなプログラミング言語では様々なツールで提供されている便利なデバッグ機能を利用した方が効率的です。
デバッガ
デバッグ作業自体は「System.out.println()」などをコード中に埋め込んで、エラー箇所を特定するような方法でも可能ですが、システム開発のような膨大なソースコードではあまりにも効率が悪くデバッガと呼ばれるデバッグ支援用のソフトウェアを利用するのが一般的です。
Eclipseをはじめとした統合開発環境(IDE)では標準で搭載されているものも多いですし、Javaではコマンドでデバッグが可能な「jdb」というツールを利用することも可能です。
デバッガで出来ること
デバッガを利用することで、プログラム実行中に一時停止させ変数に格納されている値を確認したり、変更したりすることが可能です。
デバッガは一時停止だけでなく、プログラムコードを1行ずつ実行していくようなことも可能なので、どこで不具合が起きているのかを特定しやすくなります。
Java開発で抑えておきたいデバッグ用語
Javaでデバッグ実行を行う際、よく出てくる用語についても確認しておきましょう。
キーボードのショートカットはIDEやデバッガによっても異なるので用語で検索するのがおすすめです。
ブレークポイント
ブレークポイントは実行中のプログラムを一時停止させる機能です。
指定した行で、プログラムが停止しデータの確認などが行なえます。
ブレークポイントは複数設定することが可能で、条件によって停止有無を設定することも可能です。
ステップイン
一時停止したプログラムを一行ずつ実行出来るのがステップイン機能です。
ステップインでは、対象行の処理がメソッドの呼び出しであった場合、メソッドの内部までステップ実行を行います。
最小のステップでプログラムを実行出来るため、細かくデバッグ作業を行う際に必要となります。
ステップオーバー
ステップオーバーはステップインと同じく一時停止状態から一行ずつ実行出来る機能ですが、メソッド呼び出し時の処理が異なります。
ステップオーバーではメソッドの内部までは入らず、メソッドが実行されたあとの行より再度ステップ実行を継続します。
全てのメソッドをステップ実行していると多大な時間が必要なため、ある程度ステップオーバーで目星を付けるデバッグ方法が一般的です。
ステップリターン
ステップリターンでは、現在の処理スコープのreturn処理まで実行し、呼び出し元に戻った時点で停止するステップ実行方法です。
メソッド内で利用すれば呼び出し元に移動しますし、呼び出し元がこれ以上ない場合には処理終了まで実行されます。
再開
ブレークポイントで一時停止した処理を再度実行する処理です。
次のブレークポイントが設定された行まで実行します。
ブレークポイントが以降の処理で設定されていない場合は、プログラム終了まで実行されます。
終了
一時停止された状態からプログラムを再開せず、プログラム自体を終了させます。
強制終了させる機能であるため、再度実行した場合にはプログラムの初めからスタートすることになります。
インスペクション
一時停止した状態のデータを1回だけ確認するために利用するのが「インスペクション」機能です。
確認したい変数などのデータ上で右クリックからインスペクションを選択することでポップアップが表示されます。
ウォッチ
一時停止した状態で特定のデータをデバッグ実行中監視させられる機能が「ウォッチ」機能です。
複数のブレークポイントやステップ実行と併用して利用されます。
不具合の起きているデータ変数が分かっている場合などに、処理を順番に実行しどこでおかしな値が設定されているかを特定します。
Eclipseを使ってJavaのデバッグ実行を試してみよう
では実際にEclipseを使ってJavaのサンプルコードをデバッグ実行してみたいと思います。
サンプルコード
サンプルコードとして「Main.java」ファイルに下記のコードを記述しています。
package sample; public class Main { public static void main(String[] args) { Test1 test1 = new Test1(); test1.testMethod1(); Test2 test2 = new Test2(); test2.testMethod2(); } } class Test1 { public void testMethod1() { System.out.println("Test1クラスで処理実行中"); } } class Test2 { public void testMethod2() { String str = ""; int num; Test3 test3 = new Test3(); str = test3.testMethod3("引数の値"); num = test3.testMethod4(5); System.out.println("str: " + str); System.out.println("num: " + num); } } class Test3 { public String testMethod3(String str1) { str1 = "固定値に変更しました。"; return str1; } public int testMethod4(int num1) { num1 += 3; return num1; } }
実行した結果となります。
Test1クラスで処理実行中 str: 固定値に変更しました。 num: 8
デバッグ実行
では実際にデバッグ実行をどのように行うのか確認していきましょう。
ステップ実行
ブレークポイントを任意の行に設定し、画面上部の虫アイコンをクリックすることでデバッグモードで実行することが出来ます。
ブレークポイントを設定した7行目で処理が中断されていることが分かります。
次に画面上部赤枠で囲んだステップインを実行してみると、Test1インスタンス生成のため14行目にハイライト行が移っていることが分かります。
この状態で今度はステップアウトを実行してみます。
すると今度は1行下に移動するのではなく、呼び出し元に戻っているのが分かります。
今度はメソッドを呼び出す処理部分で、ステップオーバーを実行してみてください。
するとメソッド内部に移動するのではなく1行下にハイライト行が移動していることが分かります。
ここで中断を実行すれば処理がそのまま終了しますし、再開を実行すればプログラム終了まで停止せずに処理が実行されます。
値の確認
今度は30行目にブレークポイントを設定し、変数の値を確認してみます。
一時停止している状態で確認したい変数を右クリックし「インスペクション」を選択します。
サンプルの場合「str」の値は初期値設定しかしていないので空白であることが分かります。
では同様に右クリックから「ウォッチ」を選択してみましょう。
表示される場所はEclipseの設定にもよりますが、選択した変数値がウォッチ式のウィンドウに表示されています。
このままステップオーバーで処理を実行してみると、変数の値がアップデートされていることが分かります。
インスペクションでは一時的な確認でしたが、ウォッチ式に設定しておけば継続して変数の値を確認することが出来ます。
さいごに: デバッグ実行でJavaコードのミスを効率的に発見しよう
本記事では、Javaにおけるデバッグ機能についての情報と合わせて、Eclipseでのデバッグ実行方法を初心者向けに解説してきました。
プログラムをミスなく構築することはほとんど不可能とも言えるので、デバッグ実行の方法はJavaプログラマーとなるには必須知識の1つです。
今回ご紹介した方法を参考に、デバッグ機能を使いこなし効率的にJava開発が進められるようにチャレンジしてみてください。