当我调试一个应用程序时,在调试工具窗口中有一个Watches window。我一遍又一遍地阅读本手册,但找不到任何手表的实际用法。什么是IntelliJ中的“手表”以及如何使用它们?
不知何故,我认为这是一个很酷且有用的工具,我缺乏不使用它。
有人可以解释什么时候应该使用它并给出几个样本?理想情况下,描述将被绑定到一个具体的(想象的)情况,以便我更好地将其应用于我的工作中。
当我调试一个应用程序时,在调试工具窗口中有一个Watches window。我一遍又一遍地阅读本手册,但找不到任何手表的实际用法。什么是IntelliJ中的“手表”以及如何使用它们?
不知何故,我认为这是一个很酷且有用的工具,我缺乏不使用它。
有人可以解释什么时候应该使用它并给出几个样本?理想情况下,描述将被绑定到一个具体的(想象的)情况,以便我更好地将其应用于我的工作中。
本部分允许您定义表达式,您希望看到它们如何随调试流程的每一步发展/更改,而无需手动检查所有可用对象及其属性。让我们以下面这个简单的样品,其故意抛出一个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
所以“手表”和“条件断点”是一样的吗? – sandalone
不,条件断点允许你指定一个条件来激活断点,而手表允许你在执行代码的执行行时自动评估表达式。 – Morfic
我明白了。手表是在特定点查看数值的最简单方法。但我必须知道正确的价值观?我不能仅仅为'student.getCredits()'提供一个监视器,并在通过循环调试时查看它的值? – sandalone