IntelliJ IDEAに限った機能ではありませんが、IntelliJ IDEAでJava開発する際に知っておくと便利なブレークポイントを紹介したいと思います。
「そんなの知っている」「今さらJavaか」という声はさておき、この記事をSくんとSさんにささげます。
ブレークポイントの種類
一口にブレークポイントと言っても実は様々な種類があり、色々な条件でプログラムの実行を中断できるようになっています。今回は、以下のブレークポイントを順に説明します。
- Line Breakpoint
- Temporary Line Breakpoint
- Method Breakpoint
- Exception Breakpoint
Line Breakpoint - 指定した行でストップ
これは誰もがお世話になっているブレークポイントですね。ソースコードの横っちょのバーをクリックするなり、 Ctrl + F8
を押すなりすると赤丸が表示されて有効になります。メインメニューの [Run] - [Toggle Line Breakpoint] でもOKです。
プログラムが指定行に到達すると実行が中断されるので、その時点の変数の値が期待通りか確認するなどして問題解決にあたります。
Temporary Line Breakpoint - 指定した行で1回だけストップ
その名の通り1回限りの一時的なブレークポイントです。実行を中断したい行で Ctrl + Shift + Alt + F8
を押すなり、[Run] - [Toggle Temporary Line Breakpoint] を選択するなりすると以下のスクリーンショットのような赤丸数字1が表示されて有効になります。
プログラムが指定行に到達すると実行が中断されますが、 実行を再開した時点で自動的に消滅します(デバッグ実行が完了した後も復活しません)。 まさに一時的なブレークポイントというわけです。正直なところ、ほとんど使わないです…。
Method Breakpoint - メソッドのIN/OUTを検出してストップ
メソッドブレークポイントは、行に対してではなくメソッドに対して設定するブレークポイントです。実行を中断したいメソッドにカーソルを合わせ、横っちょのバーをクリックするか、[Run] - [Toggle Method Breakpoint] を選択すると、次のスクリーンショットのような赤丸が表示されて有効になります。
メソッドブレークポイントでは、プログラムが指定メソッドに入る時(上の例では13行目)と出るとき(上の例では15行目と22行目)に実行が中断されます。
あるメソッドの事前・事後条件が期待通りか確認したり、複数のreturn文に個別にブレークポイントを設定する手間を省けたりして便利ですが、次の点には注意が必要です。
- デバッグ実行が遅くなる(IntelliJ IDEAからもひっそりと警告されます)
- 未処理の例外が発生してメソッドを出る場合は中断されない
Exception Breakpoint - 例外を検出してストップ
例外ブレークポイントは、ソースコードのどこかは分からないけれど、とにかく指定した例外が発生したときに処理を中断するためのブレークポイントです。
設定するには、まずメインメニューから [Run] - [View Breakpoints...] を選択し、以下のブレークポイントダイアログを表示します。(実はこのダイアログは例外ブレークポイントだけのものではなく、すべてのブレークポイントが一覧され、詳細な設定ができる画面になっています)
ダイアログ左上の +
ボタンをクリックし、[1. Exception Breakpoints] を選択した後、捕捉したい例外クラスを入力します。
例外ブレークポイントを設定した状態でデバッグ実行すると、その例外が発生した任意の箇所でプログラムの実行が中断されます。例えば、以下の例では20行目に配列境界バグがあるため、swap()メソッドの実行中にIndexOutOfBoundsExceptionが発生しますが、そのタイミングで自動的にプログラムが中断されてデバッグできるようになります。
この例ではすべて自分が管理しているコードでスタック階層も浅いのでありがたみが感じられませんが、未処理例外がアプリのトップレベルまで伝達されてきた時に捕捉するのではなく、発生したその瞬間に捕まえてデバッグしたい場合には重宝します。
まとめと補足
今回は、IntelliJ IDEA Advent Calendar 6日目の記事として、IntelliJでJava開発するときに使えるブレークポイントを簡単に紹介しました。デバッガーの機能の豊富さと、私の気力のなさにより、残念ながら説明できなかったけれど便利な機能は実は他にもまだまだあります。
- フィールド変数の読み書きを検出してストップ
- 特定の評価式が成り立つ場合だけストップ
- ブレークポイント間に依存関係を設定し、あるブレークポイントAにヒットしたときだけ、別のブレークポイントBでストップ
- (ブレークポイント関係ないけど)実行中断して変数の値を上書き
これらについても整理できたらいいなと思いますが、ひとまず今日のこの記事が誰かの役に立てば幸いです。
最後に、同僚が泣くので IntelliJ IDEA Advent Calendar に参加してやってください!