Ищете более простой способ написания отладочных операторов печати в Java - PullRequest
9 голосов
/ 06 августа 2009

РЕДАКТИРОВАТЬ: Я хотел бы прочитать реакции на АОП подход Стива Рида. Комментарии к его ответу приветствуются!

Я новичок, и в какой-то момент я понял, что было бы полезно знать содержимое переменной во время выполнения программы. Итак, я начал делать это:

РЕДАКТИРОВАТЬ: исправлено. Раньше было: var + ":" + var, что было совершенно неверно. Тупая опечатка.

System.err.println ( "var: " + var );

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

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

void dbug ( Object obj )
{
    String variableName = obj.somehowGetVariableName();
    String variableContents = obj.toString();
    System.out.println ( variableName +": " + variableContents );
}

Но очевидно, что получить имя переменной легче, чем сделать.

Java-отражательные как к-получить-имя-в-а-переменного

Я застрял с:

System.err.println ( "var: " + var );

Или есть популярная сокращенная версия этого?

Ответы [ 11 ]

9 голосов
/ 06 августа 2009

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

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

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

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

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

6 голосов
/ 06 августа 2009

Посмотрите на 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);
    }
}
4 голосов
/ 06 августа 2009

Я думаю, что System.err.format - это то, что вы хотите:

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

является сокращением для:

System.err.println(String.format("var: %s", var));
2 голосов
/ 06 августа 2009

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

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

2 голосов
/ 06 августа 2009

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

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

    Object[member1=,member2=...]
    

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

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

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

1 голос
/ 17 мая 2016

Мой первый совет: придерживайтесь пакета java.util.logging. Там действительно нет необходимости для сторонних библиотек журналов.

  1. Получить экземпляр java.util.Logger

    Logger logger = Logger.getLogger ("some.package.XyzClassName");

  2. Записать объекты (используя заполнитель {N})

    logger.log (Level.INFO, "logging stuff {0} and {1}", new Object [] {new String ("Test"), 1222});

В случае пользовательских классов вам нужно иметь разумную реализацию переопределения toString (), потому что этот метод вызывается при замене заполнителя в сообщении {N}.

1 голос
/ 13 апреля 2014

Если вы используете IntelliJ IDEA, вы можете использовать ярлык «Живой шаблон» для печати в System.out, например soutp (and then a TAB) для отладки параметров метода, soutv для отслеживания имени переменной вместе с ее значением и т.д.

Чтобы прочитать список ярлыков \ изменить его, перейдите в Файл-> Настройки-> Живые шаблоны-> Вывод

0 голосов
/ 25 февраля 2013

Вы пробовали DoodleDebug? Это плагин Eclipse, который должен быть таким же простым, как System.out.println(), но гораздо более мощным.

Его можно найти здесь: http://scg.unibe.ch/wiki/projects/DoodleDebug

0 голосов
/ 17 января 2012

Я бы порекомендовал вам правильно настроить и использовать Apache Log4J. Строки System.out или System.err вызывают большую задержку выполнения программы. (Это можно подтвердить, добавив некоторую информацию о времени: сколько времени занимает ваша программа без System.out и т. Д. И сколько без этих строк.)

API-интерфейсы ведения журналов используют отдельные потоки для записи информации о журналировании в файлы журналов, поэтому они более полезны в реалистичных приложениях. Также API-интерфейсы журналирования, такие как Log4J, дают большой контроль над настройкой и форматированием ваших журналов. Например, посмотрите здесь несколько журналов, сгенерированных из Log4J:

2012-01-05 15:16:41,730 [main] 16   DEBUG dmfssecbuild.IOUtil  - 
2012-01-05 15:16:41,730 [main] 16   DEBUG dmfssecbuild.IOUtil  - Application Configs Loaded
2012-01-05 15:16:41,730 [main] 16   DEBUG dmfssecbuild.Constants  - Running Application between dates.
2012-01-05 15:16:41,730 [main] 16   DEBUG dmfssecbuild.Constants  - Sat Jan 01 00:00:00 GMT+05:00 2011 From Date 
2012-01-05 15:16:41,730 [main] 16   DEBUG dmfssecbuild.Constants  - Mon Dec 31 00:00:00 GMT+05:00 2012 To Date 
0 голосов
/ 06 августа 2009

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

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

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

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

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

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