IntelliJ IDEA 2020.1ヘルプ

チュートリアル: 最初のJavaアプリケーションをデバッグする

Javaアプリケーションを作成して実行しました。期待どおりに機能しないことを発見したと想像してみましょう。例:間違った値を返すか、例外でクラッシュします。コードにエラーがあり、デバッグする時が来たようです。

デバッグとは

一般的に、デバッグとは、プログラム内のエラーを検出して修正するプロセスです。

さまざまな種類のエラーがあり、処理します。それらのいくつかは、コンパイラによって処理されるため、構文エラーのように簡単にキャッチできます。もう1つの簡単なケースは、スタックトレースを調べることでエラーをすばやく特定できる場合です。これにより、エラーが発生した場所を特定できます。

ただし、非常に注意が必要なエラーがあり、検索と修正に非常に時間がかかる場合があります。例:プログラムの初期に発生した微妙な論理エラーは、非常に遅くまで現れない場合があり、時には物事を整理するのが本当の挑戦です。

これは、デバッガが便利な場所です。デバッガーは強力なツールであり、プログラムの内部操作に関するインサイトを提供することにより、バグをより迅速に見つけることができます。これは、実行を一時停止し、変数と行がどのように変更されるかを徹底的に調べることでプログラムの状態を分析することで可能です。デバッグ中は、すべてを制御できます。このマニュアルでは、開始するための基本的なデバッグシナリオについて説明します。

コードを調べる

簡単なデバッグのケースを試してみましょう。次のアプリケーションがあるとします。

public class AverageFinder { public static void main(String[] args) { System.out.println("Average finder v0.1"); double avg = findAverage(args); System.out.println("The average is " + avg); } private static double findAverage(String[] input) { double result = 0; for (String s : input) { result += Integer.parseInt(s); } return result; } }

プログラムは、コマンドライン引数として渡されるすべての値の平均を計算することになっています。

課題なくコンパイルおよび実行されますが、結果は期待したものではありません。たとえば、入力として 1 2 3 を渡すと、結果は 6.0になります。

まず、疑わしいエラーがどこから来ているのかを考える必要があります。

問題はprintステートメントにないと仮定できます。最も可能性が高いのは、findAverage メソッドによる予期しない結果です。原因を見つけるために、実行時の動作を調べてみましょう。

ブレークポイントを設定する

ブレークポイントは、プログラムの状態を調べるためにプログラムが中断されるコード行を示します。

  • findAverage メソッドが呼び出される行のガターをクリックします。

    A breakpoint is set at the line that calls the findAverage method

デバッグモードでプログラムを実行する

次に、デバッグモードでプログラムを開始しましょう。

プログラムを実行およびデバッグするための引数を渡すため、実行/デバッグ構成にこれらの引数があることを確認してください。

  1. メインメニューから実行 | 構成の編集を選択します。

  2. プログラムの引数フィールドに引数を入力します。

    Arguments are entered in the Program arguments field
  3. main メソッドまたはその包含クラスの近くにある実行ボタンをクリックします。メニューからデバッグを選択します。

    After you click a Run button in the gutter, a menu with run/debug options appears.

プログラムの状態を分析する

デバッガーセッションが開始された後、ブレークポイントに達するまでプログラムは正常に実行されます。これが発生すると、プログラムが一時停止した行が強調表示され、デバッグツールウィンドウが表示されます。

Debugger tool window appears. The line with the breakpoint is highlighted

ハイライトされた行はまだ実行されていません。これで、プログラムはあなたからのさらなる指示を待ちます。中断状態では、プログラムの状態を保持する変数を調べることができます。

findAverage メソッドはまだ呼び出されていないため、result などのローカル変数はすべてスコープ内にありませんが、args 配列の内容を調べることができます( main メソッド内にあるため、args はスコープ内にあります)。 args の内容は、args が使用される場所にインラインで表示されます。

Inline debugging shows variable values right at the line where the respective variables are used

また、変数 パネルで現在スコープ内にあるすべての変数に関する情報を取得することもできます。

Variable values are shown in the Variables panel

プログラムのステップ・スルー

デバッグツールウィンドウに慣れていること、findAverage 方法にステップし、その中に何が起こっているかを知るための時間です。

  1. メソッドにステップインするには、ステップ・インボタンをクリックするか、F7を押します。

    Step into button located in the top part of the Debug tool window
  2. 歩き続けて、ローカル変数 result が宣言され、ループの各反復でどのように変更されるかを見てみましょう。

    Inline debugging helps us get information about the variable values

    現在、変数 s には値 "3"が含まれています。整数に変換され、現在 3.0の値を持つ resultに追加されます。今のところエラーはありません。合計は正しく計算されます。

  3. さらに2つのステップでreturnステートメントに進み、省略箇所を確認します。合計を値の数で割ることを忘れていました。これが不正なメソッド戻りの原因でした。

    The value of result is returned as is, without dividing it by the number of arguments.
  4. エラーを修正しましょう。

    return result/input.length;

デバッガーセッションを停止して再実行する

プログラムが正常に動作することを確認するために、デバッガーセッションを停止してプログラムを再実行しましょう。

  1. Stop ボタンをクリックするか、Ctrl+F2を押します。

    Debugger session is stopped using the Stop button located in the left-hand part of the Debug tool window
  2. main メソッドまたはその包含クラスの近くにある実行ボタンをクリックします。メニューから実行を選択します。

    After you click a Run button in the gutter, a menu with run/debug options appears.
  3. ここでプログラムが正しく機能することを確認します。

    The program outputs 2.0 now
最終更新日: 2020年6月2日