コンソールでの例外表示
前回紹介したように、Eclipseではコーディングだけでなく、実行まで行うことができます。ただし、その実行結果が期待通りとならないのが、プログラミングの常です。その際、どこがおかしいのかを突き止め、修正しなければなりません。
Javaの場合は、何か問題があった場合、多くは例外発生という形をとります。Eclipseでは、そのような例外はコンソールに表示されます。例えば、図1は要素数が4個の配列のインデックス4(5個目)にデータを代入するコードが記述されたJavaプログラムを実行したEclipseの画面です。
図1:不正な配列アクセスで例外が発生した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プログラムがあるとします。
[リスト1]com.example.eclipse.firstjavaproject.CalcWithRand
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行目)をダブルクリックしています。
図2:ブレークポイントが設置された画面
ダブルクリックした箇所に見える
の青いマークがブレークポイントです。ブレークポイントが付与されたソースコードは、実行時にその行を実行する手前で処理が一時停止します。ただし、通常の実行方法では一時停止にはなりません。
デバッグ実行
ブレークポイントで処理を一時停止させるためには、デバッグ実行をする必要があります。これは、パッケージエクスプローラー上の.javaファイルを右クリック、あるいはエディタ領域に表示されているソースコードを右クリックして表示されるメニューから、[実行]ではなく[デバッグ]を選択します(図3)。
図3:デバッグ実行メニュー
ツールバーからデバッグ実行をする場合は、実行ボタン
左横のデバッグ実行ボタン
を利用します。単にデバッグ実行ボタンをクリックすると、直近に実行したアプリケーションをデバッグ実行します。もし、履歴リストから選択したい場合は、
前回
紹介した実行ボタン同様に、右横の▼をクリックすると、図4のメニューが表示されるので、そこから選択します。
図4:デバッグ実行ボタンの▼クリックで表示されたメニュー
デバッグパースペクティブと変数ビュー
実際にデバッグ実行をしてみましょう。すると、図5のダイアログが表示されます。
図5:デバッグパースペクティブへの切り替え確認ダイアログ
これは、デバッグパースペクティブへの切り替えを確認するダイアログです。図3の画面は、
第1回
に紹介したように、Javaコーディングに最適化されたJavaパースペクティブです。Eclipseでは、デバッグ実行に最適化されたデバッグパースペクティブというのも用意されており、デバッグ実行をすると、自動的にそのパースペクティブへの切り替えを確認するダイアログが表示されます。そのダイアログ上の[切り替え]ボタンをクリックすると、図6のデバッグパースペクティブが表示されます。
図6:表示されたデバッグパースペクティブ
さらに、パースペクティブが切り替わるだけではなく、アプリケーションが実行され、処理がブレークポイントで一時停止された状態になっています。図6のエディタ領域の7行目が図7の通り緑色になっているのが確認できます。
図7:処理が一時停止された部分を表す緑色の行
この一時停止された状態で、右上の変数ビューを確認します(図8)。
図8:変数の値が確認できる変数ビュー
変数num1とnum2の値がそれぞれ4と6であることが確認できます。また、8行目(リスト1では(4))の変数ansが変数ビューにはないことも確認できます。これは、この段階では、処理が6行目の終了段階、つまり、7行目の実行手前で一時停止されており、8行目まで到達していないことを物語っています。
変数の値の確認がデバッグの入り口
このような変数の確認は、もちろんSystem.out.println()を使って、標準出力にnum1とnum2を表示させればわかります。しかし、num1とnum2の値の確認のためだけに記述したSystem.out.println()の行を、値の確認後に削除しなければなりません。その削除し忘れがあれば、それはそれでアプリケーションとしては問題です。
一方、デバッグは変数の値の確認が基本となっています。変数の値を確認することで、問題解決の道が開けることが多々あります。そのような変数の値を確認するにあたって、元のソースコードに手を加えることなく行えるブレークポイントとデバッグ実行は最適な方法といえます。
続きの処理を行う再開ボタン
デバッグ実行で処理が一時停止した状態では、ツールバー左側に図9のボタン群が表示されています。
図9:ツールバー上のデバッグに関するボタン群
このうち、
ボタン(再開ボタン)が処理を再開させるボタンです。このボタンをクリックすることで、一時停止された処理の続きが実行されます。一方、
ボタンは停止ボタンであり、その名の通り、現在実行中のアプリケーションを強制終了します。
なお、
ボタン(ステップインボタン)、および
ボタン(ステップオーバーボタン)については後述します。
EclipseでAWSアプリを作成してみよう〜AWS Toolkit for Eclips...
Eclipseでデータベース設計をしてみよう〜ERMasterプラグイン
EclipseでGit操作をしてみよう〜EGitプラグインを紹介
もっと読む
WINGSプロジェクト 齊藤 新三(サイトウ シンゾウ)
<
WINGSプロジェクト
について>
有限会社 WINGSプロジェクト
が運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での
登録メンバ
は55名で、現在も執筆メンバを
募集中
。興味のある方は、どしどし応募頂きたい。
著書
、
記事
多数。
RSS
Twitter:
@yyamada
(公式)、
@yyamada/wings
(メンバーリスト)
Facebook
<個人紹介>WINGSプロジェクト所属のテクニカルライター。Web系製作会社のシステム部門、SI会社を経てフリーランスとして独立。屋号はSarva(サルヴァ)。HAL大阪の非常勤講師を兼務。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この著者の最近の執筆記事
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。
Microsoft MVP
for ASP/ASP.NET。執筆コミュニティ「
WINGSプロジェクト
」代表。 主な著書に「
入門シリーズ(サーバサイドAjax/XMLDB/PEAR/Smarty)
」「
独習シリーズ(ASP.NET/PHP)
」「
10日でおぼえる入門教室シリーズ(ASP.NET/PHP/Jakarta/JSP&サーブレット/XML)
」「
Pocket詳解辞典シリーズ(ASP.NET/PHP/Perl&CGI)
」「
今日からつかえるシリーズ(PHP/JSP&サーブレット/XML/ASP)
」「
書き込み式 SQLのドリル
」他、
著書多数
。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この著者の最近の執筆記事