当我调试应用程序时,在调试工具窗口中有一个Watches window。我一遍又一遍地阅读本手册,但找不到任何手表的实用性。
不知何故,我认为这是一个很酷且有用的工具,而且我没有使用它。
有人可以解释我何时应该使用它并提供一些样品?理想情况下,描述将绑定到具体(虚构)的情况,以便我更好地将其应用于我的工作中。
答案 0 :(得分:4)
本部分允许您定义表达式,您可以在调试过程的每个步骤中查看它们如何演变/更改,而无需手动检查所有可用对象及其属性。让我们采取以下简单的样本,故意抛出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())....
。在这种情况下,您可以评估子表达式以查看哪一个返回false
<小时/> 注意:您还可以使断点成为条件,以便程序仅在发生特定事件时才会暂停: