Как вывести номера строк в журнал. Скажем, при выводе некоторой информации в журнал я также хочу напечатать номер строки, где этот вывод находится в исходном коде. Как мы видим на трассировке стека, он отображает номер строки, в которой произошло исключение. Трассировка стека доступна для объекта исключения.
Другой альтернативой может быть включение вручную номера строки при печати в журнал. Есть ли другой путь?
Ответы:
От Ангсумана Чакраборти :источник
В итоге мы использовали такой настраиваемый класс для работы с Android:
источник
getStackTrace()[3]
вместоgetStackTrace()[2]
Быстрый и грязный способ:
С некоторыми подробностями:
Это выведет что-то вроде этого:
источник
System.out.println("i am here: " + new Exception().getStackTrace()[0]);
дает мне все необходимые детали :)Я вынужден ответить, не отвечая на ваш вопрос. Я предполагаю, что вы ищете номер строки исключительно для поддержки отладки. Есть лучшие способы. Есть хакерские способы получить текущую строку. Все, что я видел, медленные. Лучше использовать фреймворк журналирования, подобный тому, что есть в пакете java.util.logging или log4j . Используя эти пакеты, вы можете настроить информацию для ведения журнала, чтобы включить контекст вплоть до имени класса. Тогда каждое сообщение журнала будет достаточно уникальным, чтобы знать, откуда оно пришло. В результате в вашем коде будет переменная logger, которую вы вызываете через
вместо того
источник
Log4J позволяет включать номер строки как часть шаблона вывода. См. Http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html для получения подробной информации о том, как это сделать (ключевой элемент в шаблоне преобразования - «L»). Однако Javadoc включает следующее:
источник
Код, опубликованный @ simon.buchan, будет работать ...
Но если вы вызываете его в методе, он всегда будет возвращать номер строки в методе, поэтому лучше используйте встроенный фрагмент кода.
источник
Я бы рекомендовал использовать набор инструментов для ведения журнала, например log4j . Ведение журнала можно настроить с помощью файлов свойств во время выполнения, и вы можете включить / выключить такие функции, как ведение журнала номера строки / имени файла.
Глядя на javadoc для PatternLayout, вы получите полный список опций - вам нужен % L.
источник
Я использую этот небольшой метод, который выводит трассировку и номер строки метода, который его вызвал.
Дважды щелкните вывод, чтобы перейти к этой строке исходного кода!
Вам может потребоваться отрегулировать значение уровня в зависимости от того, где вы разместили свой код.
источник
Util
взялось?Вы не можете гарантировать согласованность номеров строк с кодом, особенно если он скомпилирован для выпуска. В любом случае я бы не рекомендовал использовать номера строк для этой цели, было бы лучше указать полезную нагрузку места, где было возбуждено исключение (тривиальный метод - установить сообщение, включающее детали вызова метода).
Возможно, вам захочется взглянуть на обогащение исключений как на метод улучшения обработки исключений http://tutorials.jenkov.com/java-exception-handling/exception-enrichment.html
источник
Если он был скомпилирован для выпуска, это невозможно. Возможно, вы захотите изучить что-то вроде Log4J, которое автоматически предоставит вам достаточно информации, чтобы довольно точно определить, где произошел записанный код.
источник
сначала общий метод (в служебном классе, хотя в простом старом коде java1.4 вам, возможно, придется переписать его для java1.5 и более)
Затем специальный служебный метод для получения правильного stackElement:
источник
Вот логгер, который мы используем.
он охватывает Android Logger и отображает имя класса, имя метода и номер строки.
http://www.hautelooktech.com/2011/08/15/android-logging/
источник
Посмотри по этой ссылке . В этом методе вы можете перейти к своему строковому коду, дважды щелкнув строку LogCat.
Также вы можете использовать этот код для получения номера строки:
источник
источник
Все они дают вам номера строк вашего текущего потока и метода, которые отлично работают, если вы используете try catch там, где вы ожидаете исключения. Но если вы хотите перехватить какое-либо необработанное исключение, тогда вы используете обработчик неперехваченных исключений по умолчанию, и текущий поток вернет номер строки функции обработчика, а не метод класса, вызвавший исключение. Вместо использования Thread.currentThread () просто используйте Throwable, переданный обработчиком исключений:
В приведенном выше примере используйте e.getStackTrace () [0] в своей функции-обработчике (fShowUncaughtMessage), чтобы поймать нарушителя.
источник
Ниже показан проверенный код для строки журнала без имени класса и имени метода, откуда вызывается метод ведения журнала.
источник
Это
stackLevel
зависит от глубины, на которой вы вызываете этот метод. Вы можете попробовать от 0 до большого числа, чтобы увидеть, в чем разница.Если
stackLevel
это законно, вы получите строку видаjava.lang.Thread.getStackTrace(Thread.java:1536)
источник
Это именно та функция, которую я реализовал в этой библиотеке XDDLib . (Но это для android)
Один щелчок по подчеркнутому тексту позволяет перейти туда, где находится команда журнала.
Это
StackTraceElement
определяется первым элементом вне этой библиотеки. Таким образом, в любом месте за пределами этой библиотеки будет законным, в том числеlambda expression
,static initialization block
и т.д.источник
Мой способ работает для меня
источник
вы можете использовать -> Reporter.log ("");
источник