IntelliJ中的“手表”是什么以及如何使用它们?

san*_*one 3 intellij-idea

当我调试应用程序时,在调试工具窗口中有一个Watches窗口。我已经一遍又一遍地阅读了本手册,但是找不到手表的任何实用用法。

不知何故,我认为这是一个很酷且有用的工具,我缺乏不使用它的能力。

有人可以解释我什么时候应该使用它并提供一些样品吗?理想情况下,描述应与具体的(虚构的)情况相关,以便我更好地将其应用于我的工作中。

Mor*_*fic 5

本部分允许您定义表达式,以查看它们在调试过程的每个步骤中如何演变/更改,而无需手动检查所有可用对象及其属性。让我们看一下以下有意引发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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在某个时间点,您可能想知道如何获得NPE以及需要解决的问题。因此,只需设置一个断点,添加一些手表,然后小心地完成所有步骤。最终,您将看到麻烦制造者:

手表

当然,这是一个基本示例,应该这样考虑。在常规应用程序中,您可能需要检查更复杂的场景和表达式,这将更有意义,例如:if (((position > 0 && position < MAX) || (position < 0 && position > MIN) && (players(currentPlayer).isNotDead() && move.isAllowed()) && time.notUp())....。在这种情况下,您可以评估子表达式以查看哪个返回假


注意:您还可以将断点设置为条件,以便仅在发生特定事件时程序才会暂停: 在此处输入图片说明

  • 否,条件断点使您可以指定激活断点的条件,而watch使您可以在逐步执行代码行时自动评估表达式 (2认同)