Поиск более легкого способа записать отладку операторов печати в Java

Если у Вас, оказывается, есть некоторые игры MS-DOS прежней версии вокруг, это могло бы быть полезно;-)

9
задан Community 23 May 2017 в 11:53
поделиться

7 ответов

Я бы не стал писать какие-то причудливые методы для вывода отладочной информации. Просто используйте либо LOG.debug (...) , если вы используете регистратор, либо System.err.println (...) в противном случае.

Вы можете пожелать используйте String.format ("var =% s val =% s", "VarName", val) вместо объединения строк.

Убедитесь, что вы переопределили toString в каждом из ваших классов, чтобы предоставить значимую информацию об отладке.

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

Единственный раз, когда я

9
ответ дан 4 December 2019 в 08:34
поделиться

Взгляните на Simple Logging Framework , он позволяет вам вводить:

class Example {
    static final org.slf4j.Logger LOG = org.slf4j.LoggerFactory.getLogger(Example.class);

    void doSomething(Object obj1, Object obj2) {
        LOG.debug("This is object 1: {}, and this is object 2: {}", obj1, obj2);
    }
}
6
ответ дан 4 December 2019 в 08:34
поделиться

Я думаю, что System.err.format - это то, что вам нужно:

System.err.format("var: %s\n", var);

- это сокращение для:

System.err.println(String.format("var: %s", var));
4
ответ дан 4 December 2019 в 08:34
поделиться

Лично я не предлагаю где-либо использовать операторы sysout. Вы всегда должны использовать отладчик (используя некоторую IDE). Я не могу представить, где это было бы нежелательно.

В противном случае я предлагаю фреймворки журналирования, такие как log4j, но опять же, это уже становится более сложным, когда я снова переключился бы на настоящую IDE с отладчиком.

2
ответ дан 4 December 2019 в 08:34
поделиться

Некоторые мысли:

  1. Я бы реализовал toString () для интересующих объектов и таким образом распечатал бы члены в дружественном стиле (например, преобразовать отметки времени в читаемый формат и т. д.). Обычно я выбираю такой формат:

     Объект [member1 =, member2 = ...]
    

    В противном случае печать одного объекта даст вам имя класса плюс хэш-код идентификации, и (как вы обнаружили) это не очень полезно!

    Commons имеет возможность делать это автоматически . Но вот простой toString () учебник , который я считаю более подходящим.

  2. Существуют фреймворки журналирования, которые могут вас заинтересовать в будущем. например, посмотрите Log4j . На данный момент, однако, я бы не стал беспокоиться об этом.

2
ответ дан 4 December 2019 в 08:34
поделиться

Это натянуто, но ...

Вы получаете совет использовать IDE вместо простого текстового редактора. Я бы согласился с этим, на 100%.

Вы получаете совет использовать фреймворк регистрации или отладчик вместо вызовов println (). Ну, конечно, но ...

Еще лучше юнит-тесты. Не спрашивайте, что это - скажите, что вы ожидаете. Затем интегрированная среда модульного тестирования (обычно junit) проверит, что вы получаете то, что ожидаете. Чем больше я использую модульные тесты, тем меньше мне нужна отладка и тем меньше мне нужны println. И когда что-то меняется, среда тестирования говорит мне - мне не нужно вручную повторно оценивать результаты каждого теста, просто наблюдайте за полосой.

Модульные тесты лучше, чем отладка, лучше, чем ведение журнала. Они не являются 100% заменой для отладки и ведения журнала, но начните их использовать, и вы обнаружите гораздо меньше необходимости в этих утомительных действиях.

0
ответ дан 4 December 2019 в 08:34
поделиться

Вы можете получить доступ к именам переменных с помощью АОП и переплетения во время компиляции. Самое приятное в этом заключается в том, что, если вы не выполняете переплетение, вы не добавляете код ведения журнала отладки, и в результате ваш исполняемый код становится более компактным и быстрым.

Вот пример использования AspectJ для создания исключения когда для поля установлено значение NULL. Обратите внимание на использование « joinPoint.getSignature () » для получения доступа к метаданным кода.

@Aspect
public class NotNullValidator {

   @Pointcut(value = "set(@com.acme.NotNull * *.*) && args(valueBeingSet)")
   private void setOfNonNullField(final Object valueBeingSet) { }

   @Before(value = "setOfNonNullField(valueBeingSet)")
   public void validate(final JoinPoint joinPoint, final Object valueBeingSet) {
      if (valueBeingSet == null) {
         throw new NullPointerException("Cannot set " + joinPoint.getSignature().getName() + " to null.");
      }
   }
}

См. Javadoc JoinPoint , чтобы узнать, что еще вы можете получить (номера строк, исходные и целевые объекты и т. Д.).

0
ответ дан 4 December 2019 в 08:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: