Что такое «часы» в IntelliJ и как их использовать?

#intellij-idea

#intellij-идея

Вопрос:

Когда я отлаживаю приложение, в окне инструмента отладки появляется окно часов. Я читал это руководство снова и снова, но не могу найти никакого практического использования часов.

Почему-то я думаю, что это классный и полезный инструмент, и мне не хватает его использования.

Может кто-нибудь объяснить, когда я должен его использовать, и привести несколько примеров? В идеале описание будет привязано к конкретной (воображаемой) ситуации, чтобы я лучше применял его в своей работе.

Ответ №1:

Этот раздел позволяет вам определять выражения, которые вы хотели бы видеть, как они развиваются / изменяются на каждом этапе вашего процесса отладки, без проверки вручную всех доступных объектов и их свойств. Давайте возьмем следующий простой пример, который намеренно вызывает исключение NullPointerException (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 amp;amp; position < MAX) || (position < 0 amp;amp; position > MIN) amp;amp; (players(currentPlayer).isNotDead() amp;amp; move.isAllowed()) amp;amp; time.notUp()).... . В этом случае вы можете оценить вложенные выражения, чтобы увидеть, какое из них возвращает false


** Примечание **: вы также можете сделать точку останова условной, чтобы программа приостанавливалась только при возникновении этого конкретного события:

Комментарии:

1. Нет, условные точки останова позволяют указать условие для активации точки останова, а часы позволяют автоматически вычислять выражения по мере прохождения по исполняемым строкам кода

2. Я понял. Часы — это самый простой способ просмотра значений в определенный момент. Но я должен правильно знать значения? Я не могу просто установить часы student.getCredits() и просмотреть их значения при отладке через цикл?

3. Да, вы можете, и именно поэтому вы должны это использовать, просто посмотрите на мою первую картинку, поскольку я оцениваю оба getName() и getCredits() одновременно. Просто имейте в виду, что никакой черной магии не произойдет, если вы добавите в часы выражение, которое не может быть оценено или которое не имеет смысла в текущем контексте, например teacher.something() , asghdas , и т. Д

4. Вам нужно знать значение, если вы хотите создать условную точку останова, поскольку вы должны указать, когда эта точка останова должна активировать и приостановить приложение