當我調試一個應用程序時,在調試工具窗口中有一個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