IntelliJ IDEA 2024.1 ヘルプ

チュートリアル: 値の設定

このチュートリアルでは、最も基本的ではありますが非常に便利なデバッガー機能の 1 つである値の設定の使用方法を学習します。

デバッグ中に、プログラムが特定の方法で動作する理由を理解するために変数に関する情報を取得し、調べます。また、変数に依存するバグを再現したい場合もあります。これを行うには、この変数に特定の値を保持する必要があります。

実行時にプログラムを変更せずに一部の条件を再現するのは退屈で時間がかかる場合があるため、ほとんどの場合、デバッガーから直接変数値を設定することでメリットが得られます。

問題

次の簡単なプログラムを見てみましょう。

import java.util.*; class Aquarium { private ArrayList<Fish> fish; public static void main(String[] args) { var aquarium = new Aquarium(); System.out.println(aquarium.getFish()); // fish has already been initialized System.out.println(aquarium.getFish()); // line n1 } private ArrayList<Fish> getFish() { if (fish == null) initFish(); return fish; } private void initFish() { fish = new ArrayList<>(Arrays.asList( new Fish("Bubbles"), new Fish("Calypso"), new Fish("Dory") )); } } class Fish { private String name; Fish(String name) { this.name = name; } public String toString() { return name; } }

このコードには、2 回出力されるインスタンス変数(fish)があります。fish 変数の getter は遅延初期化を使用します。つまり、オブジェクトは最初に必要になったときにのみ初期化されます。

fish がすでに初期化されていて(line n1 にいると仮定して)、initFish メソッドを調べたい場合はどうでしょうか。このメソッドは、(fish == null)true に評価される場合にのみ実行されます。

この単純なケースでは、メソッドにブレークポイントを設定し、セッションを再開するだけです。ただし、より複雑なケースでは、セッションを再開して特定の状態に至るすべての手順を実行するのは非常に不便である場合があります。それでは、よりスマートな方法を学びましょう。

ソリューション

line n1 にいるため、initFish メソッドで ArrayList 初期化を実行する必要があります。

  1. initFish メソッドにブレークポイントを配置します。

    Breakpoint in the initFish method
  2. 変数タブで、aquarium を展開し、fish を右クリックして、値の設定を選択します。

    The array on the Variables tab
  3. null と入力します。Enter を押します。

    Setting the reference to null
  4. F9 を押して、デバッガーセッションを再開します。

これで、条件は true に評価され、initFish メソッドをステップ実行して、初期化がどのように実行されるかを確認できます。

要約

このチュートリアルの例では、実行時に変数を変更してプログラムのフローを変更する方法を示しました。この例は非常に単純ですが、より複雑なプロジェクトにも同じ原則を適用できます。この機能を使用すると、多くの時間を節約できます。