1. ホーム
  2. intellij-idea

[解決済み] IntelliJの「ウォッチ」とは何か、どう使うのか?

2022-02-09 07:36:12

質問内容

アプリをデバッグすると、デバッグツールウィンドウに ウォッチウィンドウ . このマニュアルを何度も読み返しましたが、Watchesの実用的な使い方を見つけることができません。

なぜか、これはクールで便利なツールだと思うのですが、使わないでいると物足りないです。

どなたか、どのような場合に使うべきか、いくつかのサンプルを挙げて説明していただけませんか?理想は、具体的な(想像上の)状況に結びついた説明で、自分の仕事にうまく適用できるようにすることです。

どのように解決するのですか?

このセクションでは、利用可能なすべてのオブジェクトとそのプロパティを手動で検査することなく、デバッグプロセスの各ステップでそれらがどのように進化/変化するかを確認したい式を定義することができます。NullPointerException (NPE) を意図的に投げる、次の簡単なサンプルを見てみましょう。

public class WatchSample {

    static class Student {
        public static final int CREDITS_REQUIRED_FOR_GRADUATION = 10;
        private String name;
        private Integer credits;

        public Student(String name, Integer credits) {
            this.name = name;
            this.credits = credits;
        }

        String getName() {
            return name;
        }

        public boolean hasGraduated() {
            return credits >= CREDITS_REQUIRED_FOR_GRADUATION;
        }

        public Integer getCredits() {
            return credits;
        }
    }

    public static void main(String[] args) throws Exception {
        List<Student> students = simulateReadingFromDB();

        for (Student student : students) {
            if (student.hasGraduated()) {
                System.out.println("Student [" + student.getName() + "] has graduated with [" + student.getCredits() + "] credits");
            }
        }
    }

    private static List<Student> simulateReadingFromDB() {
        List<Student> students = new ArrayList<>(3);
        students.add(new Student("S1", 15));
        students.add(new Student("S2", null)); // <- simulate some mistake
        students.add(new Student("S3", 10));
        return students;
    }
}

ある時点で、なぜNPEが発生するのか、何を修正する必要があるのか、と思うかもしれません。そこで、ブレークポイントを設定し、いくつかのウォッチを追加して、注意深く行をたどってみてください。最終的には、トラブルメーカーが見えてくるはずです。

もちろん、これは基本的な例なので、そのように受け止めるべきです。通常のアプリでは、おそらくもっと複雑なシナリオや検査したい表現があるはずで、例えばこのような表現はもっと意味があるはずです。 if (((position > 0 && position < MAX) || (position < 0 && position > MIN) && (players(currentPlayer).isNotDead() && move.isAllowed()) && time.notUp()).... . この場合、副式を評価して、どれが偽を返すかを確認することができます。


**注**: 特定のイベントが発生したときだけプログラムが一時停止するように、ブレークポイントを条件付きにすることもできます。