});ランタイムエラーが発生したときに、コンソールなどによく表示されるものとして、「スタックトレース」があります。これは、例外の発生状況と発生個所を詳細に示すもので、デバッグ時には大いに役に立ちます。読み方が分からないと何から手を付けたらよいか分からないのも事実です。Web系のプログラミングをされている方は、非常に長いスタックトレースや2組のスタックトレースが同時に表示されてしまい何をどう見ればよいのか分からないこともあるのではないでしょうか。今回は、まずスタックトレースの読み方から解説しましょう。分類:ランタイムエラースタックトレースは、その例外に関連しているクラスの数によって長さはまちまちですが、その書式は一定です。次のようなクラスを見てみましょう。このプログラムはServletクラスです。このプログラムを、Tomcat(バージョンは5.5.12を想定)で実行してみます(web.xmlの記述や、デプロイの方法については割愛します)。実行時に、URLにnumberというパラメータを付けると、その数値を2乗した値が表示されますが、パラメータの内容が数値でない場合は、例外が発生し、ブラウザにはスタックトレースの内容が表示されます。スタックトレースの内容を見てみましょう。Tomcat/5.5.12のログに記録されています」とあるとおり、ブラウザにはトレースの一部しか表示されていませんので、Tomcatのログに表示されるトレースを見てみることにします。大量のトレースが表示されていますが、まずは先頭から順に見ていきましょう。トレースの先頭は、例外クラス名とその詳細メッセージです。java.lang.NumberFormatExceptionは、数値のフォーマットに関する例外です。"aaa"」から、正確な意味が分からなくても、何となく"aaa"という文字列に関連して何か原因がありそうだということが分かります。次にこの例外がどこで発生しているかを見てみましょう。スタックトレースにはかなり多くのクラス名が列挙されていますが、大半のクラス名は見る必要がありません(注)。このスタックトレースで見るべきクラス名は、「自分が作成したクラス」です。自分の作成したクラスです。()内にある行番号を見れば、実際のソース上での例外発生個所が分かりますので、あとはその個所で例外となり得る原因を考え、対処を施すことになります。この例ではInteger.parseInt()を実行する際に、数値以外の文字列が入ってしまう可能性があるため、その場合に例外が発生するのです。注:実際には、スタックトレースは例外が発生した直接の原因となるメソッドから順に、呼び出し元のメソッドの個所が連なって表示されます。上位に表示されたメソッドほど直接の例外の発生原因に近いのですが、それがAPIやフレームワークなどのクラスのメソッドである場合、それら自身のバグでない限りは、まず自分のクラスを疑うのが原則です。Exception」が出てしまった分類:コンパイルエラーこのコンパイルエラーは、例外処理を扱うプログラミングをしている場合によく遭遇するものです。次の例を見てください。Exception」が表示されます。スローするにはキャッチまたは、スロー宣言をしなければなりません。このコンパイルエラーの対処を知るには、例外処理の仕組みについて少々知っておく必要があります。java.lang.Exceptionを基底とする例外クラスを自分のプログラムから送出(throw)する場合には、メソッド定義部にthrows節を用いて送出される可能性のある例外クラスをあらかじめ定義しておく必要があります。そのメソッドから例外を送出するつもりがない場合は、try〜catch構文によってその例外を補足し、例外が送出されないようにしなければなりません。throws節を追加し、前者の対応を行う場合は、setAgeメソッドの定義は次のようになります。}}こうすることで、正しく例外送出ができるように定義することができます。後者の対応が必要な例を見てみましょう。ClassNotFoundException」が表示されます。そこで、try〜catch節を使ってこの例外を捕捉できるようにしてみましょう。することで、例外を正しく捕捉できるように定義することができます。「NullPointerException」が発生した分類:ランタイムエラーNullPointerExceptionは、ランタイムエラーの中でも非常によく見かけるものの1つです。使おうとするとスローされます。以下のような場合があります。Throwable値であるかのようにスローとあります。中身がnullのオブジェクトに対して何か操作をしようとすると起きる例外ということですね。}このプログラムを実行すると、NullPointerExceptionが発生します。この例は直前の行で変数strにnullを代入しているので非常に分かりやすいのですが、もっと複雑なコードでは、その個所を見ただけではそのオブジェクトがnullなのかどうかは分からないことが多いのです。発生個所からコードをさかのぼっていき、オブジェクトにnullが代入されたり、nullに初期化したままになっていないかどうかを調べてみましょう。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。