2014-06-27 164 views
2

當我調試一個應用程序時,在調試工具窗口中有一個Watches window。我一遍又一遍地閱讀本手冊,但找不到任何手錶的實際用法。什麼是IntelliJ中的「手錶」以及如何使用它們?

不知何故,我認爲這是一個很酷且有用的工具,我缺乏不使用它。

有人可以解釋什麼時候應該使用它並給出幾個樣本?理想情況下,描述將被綁定到一個具體的(想象的)情況,以便我更好地將其應用於我的工作中。

回答

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,什麼需要修理。所以,只需設置一個斷點,添加幾個手錶並小心翼翼地穿行。最終你會在視線肇事者結束:

watches

當然,這是一個基本的例子,應該採取這樣。在一個普通的應用程序中,你可能會有更復雜的場景和表達式來檢查,這會更有意義,例如:if (((position > 0 && position < MAX) || (position < 0 && position > MIN) && (players(currentPlayer).isNotDead() && move.isAllowed()) && time.notUp())....。在這種情況下,你可以評估子表達式,看看哪一個返回false


注意:你也可以將斷點條件,這樣程序就會暫停,只有當特定事件發生: enter image description here

+0

所以「手錶」和「條件斷點」是一樣的嗎? – sandalone

+1

不,條件斷點允許你指定一個條件來激活斷點,而手錶允許你在執行代碼的執行行時自動評估表達式。 – Morfic

+0

我明白了。手錶是在特定點查看數值的最簡單方法。但我必須知道正確的價值觀?我不能僅僅爲'student.getCredits()'提供一個監視器,並在通過循環調試時查看它的值? – sandalone

相關問題