チュートリアル: 最初の Java アプリケーションをデバッグする
Java アプリケーションを作成して実行しました。期待どおりに機能しないことに気付いたとしましょう。例: 間違った値を返すか、例外でクラッシュします。コードにエラーがあるようです。それをデバッグする時が来ました。
デバッグとは
一般的に、デバッグとは、プログラム内のエラーを検出して修正するプロセスです。
さまざまな種類のエラーがあり、処理します。それらのいくつかは、コンパイラーによって処理されるため、構文エラーのように簡単にキャッチできます。もう 1 つの簡単なケースは、スタックトレースを調べることでエラーをすばやく特定できる場合です。これにより、エラーが発生した場所を特定できます。
ただし、非常に扱いが難しく、発見して修正するのに非常に時間がかかるエラーもあります。例: プログラムの早い段階で発生した微妙なロジックエラーは、非常に遅くまで顕在化しない場合があり、場合によっては問題を解決することが非常に困難になります。
これは、デバッガーが便利な場所です。デバッガーは強力なツールであり、プログラムの内部操作に関するインサイトを提供することにより、バグをより迅速に見つけることができます。これは、実行を一時停止し、変数と行がどのように変更されるかを徹底的に調べることでプログラムの状態を分析することで可能です。デバッグ中は、すべてを制御できます。このマニュアルでは、開始するための基本的なデバッグシナリオについて説明します。
コードを調べる
簡単なデバッグのケースを試してみましょう。次のアプリケーションがあるとします。
プログラムは、コマンドライン引数として渡されるすべての値の平均を計算することになっています。
問題なくコンパイルおよび実行されます。ただし、結果は期待したものではありません。たとえば、入力として 1 2 3
を渡すと、結果は 6.0
になります。
まず第一に、疑わしいエラーがどこから来ているのかを考える必要があります。問題は print ステートメントにはないと推測できます。ほとんどの場合、予期しない結果が findAverage
メソッドから得られます。原因を見つけるために、実行時の動作を調べてみましょう。
ブレークポイントの設定
プログラムが実行時にどのように動作するかを調べるには、疑わしいコードの前に実行を一時停止する必要があります。これは、ブレークポイントを設定することによって行われます。ブレークポイントは、プログラムの状態を調べるためにプログラムが中断されるコード行を示します。
findAverage
メソッドが呼び出される行のガターをクリックします。
デバッグモードでプログラムを実行する
次に、デバッグモードでプログラムを開始しましょう。
プログラムを実行およびデバッグするための引数を渡すため、実行 / デバッグ構成にこれらの引数があることを確認してください。
ガターの実行アイコンをクリックしてから、実行構成の変更を選択します。
プログラム引数フィールドに引数を入力します。
main
メソッドの近くにある実行ボタンをクリックします。メニューからデバッグを選択します。
プログラムの状態を分析する
デバッガーセッションが開始された後、ブレークポイントに達するまでプログラムは正常に実行されます。これが発生すると、プログラムが一時停止した行がハイライトされ、デバッグツールウィンドウが表示されます。
![デバッグツールウィンドウが表示されます: ブレークポイントのある行がハイライトされます Debug tool window appears. The line with the breakpoint is highlighted](https://resources.jetbrains.com/help/img/idea/2023.2/debug_tutorial_tool_overview.png)
ハイライトされた行はまだ実行されていません。これで、プログラムはあなたからのさらなる指示を待ちます。中断状態では、プログラムの状態を保持する変数を調べることができます。
findAverage
メソッドはまだ呼び出されていないため、result
などのすべてのローカル変数はまだスコープ内にありませんが、args
配列の内容を調べることができます(args
は main
メソッドのスコープ内にあります)。args
の内容は、args
が使用されるインラインで表示されます。
![インラインデバッグでは、それぞれの変数が使用されている行に変数値が表示されます Inline debugging shows variable values right at the line where the respective variables are used](https://resources.jetbrains.com/help/img/idea/2023.2/debug_tutorial_analyzing_1.png)
また、変数パネルで現在スコープ内にあるすべての変数に関する情報を取得することもできます。
![変数値は変数パネルに表示されます Variable values are shown in the Variables panel](https://resources.jetbrains.com/help/img/idea/2023.2/debug_tutorial_analyzing_2.png)
プログラムのステップスルー
デバッグツールウィンドウに慣れたところで、findAverage
メソッドにステップインして、その内部で何が起こっているかを調べます。
メソッドにステップインするには、ステップインボタンをクリックするか、F7 を押します。
実行ポイントを 1 ステップ進めたため、エディターで別の行がハイライトされます。
ステップオーバー F8 でステップを続行します。ステップインとの違いに注意してください。また、実行を 1 歩進めますが、途中で
Integer.parseInt()
などの他のメソッドを訪問することはありません。ステップを続けて、ローカル変数
result
がどのように宣言され、ループの各反復でどのように変更されるかを見てみましょう。現在、変数
s
には値"3"
が含まれています。int に変換され、現在3.0
の値を持つresult
に追加されます。これまでのところエラーはありません。合計は正しく計算されます。さらに 2 つのステップを経て
return
ステートメントにたどり着き、どこが省略されているかがわかります。入力数で割らずに6.0
の値を持つresult
を返します。これが、誤ったプログラム出力の原因でした。エラーを修正しましょう。
return result / input.length;
デバッガーセッションを停止し、プログラムを再実行する
プログラムが正常に動作することを確認するために、デバッガーセッションを停止してプログラムを再実行しましょう。
Stop
ボタンをクリックするか、Control+F2 を押します。main
メソッドの近くにある実行ボタンをクリックします。メニューから実行を選択します。ここでプログラムが正しく機能することを確認します。
関連ページ:
![](https://resources.jetbrains.com/help/img/idea/2023.2/java-tutorial-new-project.png)
初めての Java アプリケーションを作成する
このチュートリアルでは、をシステム出力に出力する簡単な Java アプリケーションを作成、実行、パッケージ化する方法を学びます。その過程で、開発者としての生産性を向上させるための IntelliJ IDEA の機能、つまりコーディングアシスタントと補助的なツールに慣れましょう。プロジェクトを準備する:新規 Java プロジェクトを作成する IntelliJ IDEA では、プロジェクトを使用して、ソースコード、テスト、使用するライブラリ、ビルド手順、個人設定を 1 つのユニットに整理できます。I...
![](https://resources.jetbrains.com/help/img/idea/2023.2/debug_altering_flow_return.png)
プログラムの実行フローを変更する
アプリケーションのデバッグ中は、通常、プログラムの通常のフローに従います。ただし、それから逸脱する必要がある場合があります。これは、特定の条件を再現するため、またはプログラムが問題を処理する方法をテストするために必要になる場合があります(たとえば、値の処理や例外の処理)。また、これは、現在調査中の問題に関係のないプログラムの特定の部分をスキップする必要がある場合に便利です。前のスタックフレームに戻る:IntelliJ IDEA を使用すると、プログラムの実行フローで前のスタックフレームにフォー...
![](https://pleiades.io/icons/idea.png)
チュートリアル: 値の設定
このチュートリアルでは、最も基本的ではありますが非常に便利なデバッガー機能の 1 つである値の設定の使用方法を学習します。デバッグ中に、プログラムが特定の方法で動作する理由を理解するために変数に関する情報を取得し、調べます。また、変数に依存するバグを再現したい場合もあります。これを行うには、この変数に特定の値を保持する必要があります。実行時にプログラムを変更せずに一部の条件を再現するのは退屈で時間がかかる場合があるため、ほとんどの場合、デバッガーから直接変数値を設定することでメリットが得られます...