2014-06-27 216 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

相关问题