Логирование стек-трейса

  • 3
  • Недоступна
Если вы занимаесь чем-то более или менее серьезно, вы, так или иначе, придете к логированию. Не медлим, реализуем метод log. Он должен выводить на экран имя класса и имя метода (в котором вызывается метод log), а также переданное сообщение. Имя класса, имя метода и сообщение разделим для наглядности двоеточием с пробелом.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (145)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
B. RIDER15 уровень, Братислава
25 июля, 19:49
"Всего эту задачу решили 25171 учеников" - еще на 8 уровне их было 50 тыс!!! наверное после стактрасе люди начинают думать что кодинг не для них
Максим Дудин9 уровень, Калининград
30 июля, 17:36
а где такую статистику посмотреть?
Виктория12 уровень, Москва
31 июля, 07:47
IDEA показывает статистику задачи после ее решения
Nikita Maximov9 уровень, Москва
13 июля, 11:18
Вообщем по аналогии с предыдущими задачами взят элемент массива с индексом [2], хотя почему именно это число, не понятно, в лекции ничего про это не сказано. Далее вызываем уже .getClassName() и .getMethodName() PS: Вывод в одну строку , сначала посмотрел на условие справа, там каждый вывод в разных строках, повнимательнее надо быть.
Slaby14 уровень
7 июля, 19:18
Задачу решил, но не понял одного момента. Я стал циклом выводить все в консоль, а именно i, вызывающий класс и метод. И, если я верно понял, то в стек все кладется сверху. Так вот, вывод в консоль вот такой
0 | java.lang.Thread | getStackTrace
1 | com.javarush.task.task09.task0906.Solution | log
2 | com.javarush.task.task09.task0906.Solution | main
Метод main вызывает метод log, это видно. Но почему тогда основной поток имеет индекс 0?
Udjin12 уровень, Москва
3 августа, 20:05
Я вообще решил через парсинг строки через .split и потом ее сборкой в требуемый формат :) Про getClassName только тут узнал )
Александр10 уровень, Минск
29 июня, 13:15
Интересный момент, точнее для меня так показался, когда мы выводим имя класса, и пишем индекс массива 1 или 2, то выводит все верно,а если вызвать с индексом ноль, то мы обращаемся к методу getStackTrace(), который в свою очередь пишет имя своего класса java.lang.Thread
Pavel Dyakov14 уровень, Санкт-Петербург
1 июля, 06:40
тоже обратил на это внимание, но не понял почему всё правильно работает с индексом 1 и 2.
Александр10 уровень, Минск
3 июля, 09:39
Потому что под индексом 2 лежит метод log( а мы выводим имя класса, а оно Solution),а под первым индексом у нас метод main(мы же выводим имя класса,а оно тоже Solution),а под индексом 0 у нас лежит метод getStackTrace который выводит имя своего класса java.lang.Thread
Ayrat11 уровень, немосква
24 июня, 13:24
1 уровень: вот вам System.out.println(), пишите его во всех задачах, будет вам щастье. 9 уровень: 雪姑娘(俄罗斯童话故事), Амиго, ты всё понял? - Да! - вот тебе задачи!
Alexander12 уровень, Днепр
17 июня, 21:51
Solution.class.getName() - Не надо так делать, валидатору не нравится )))
22 мая, 21:41
все по теме, надо создать коллекцию стек трейс, дальше работать как с массивом. Только чтоб решение прошло, лучше при указании номера позиции в массиве, указывать именно цифру, мой первый вариант - длина массива минус 1 не проканал, заменил на 2 (что собственно одно и тоже), решение было принято.
Sasha Motorin17 уровень, Кострома
1 июля, 20:27
Длина массива -1 и не будет работать. потому что стек работает по правилу "последний пришёл - первый вышел", а из этого выходит, что при создании StackTrace, метод, который его создаёт всегда первый (0). метод, в котором он вызывается всегда второй(1), а метод в котором вызывается второй метод всегда третий(2).
NEURO MANT9 уровень, Белая Церковь
пятница, 20:00
А в чем разница то? array.length - 1 и есть последний метод вызвавший StackTrace
NEURO MANT9 уровень, Белая Церковь
пятница, 20:26
Аааа... дошло
Shamil14 уровень, Киев
20 мая, 12:17
Пример вывода не видно полностью. Пример вывода: com.javarush.task.task09.task0906.Solution: main: In main method
Александр Назаров19 уровень, Санкт-Петербург
17 мая, 21:53
Единственная задача, которую целиком сам решил. Задача реально очень простая, но наглядно показывает работу getClassName и getMethodName.
Cruelz15 уровень, Санкт-Петербург
12 июня, 18:02
Мучал getClass и гугл. Оказалось, что нужен getClassName😖
oleksiy surovtsev10 уровень, Черкассы
12 мая, 13:15
Может у меня ход мыслей не правильный но я считаю что задача весьма не корректная, я сделал так: StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); а потом брал последний элемент в строку загонял имя класса этого элемента String className = stackTraceElements[stackTraceElements.length - 1].getClassName(); также я поступил и с именем метода. Результат получился идентичен требуемому но валидатор не принял пришлось переделывать.
Александр10 уровень, Минск
29 июня, 13:18
Может быть ругался потому что вы вписываете имя класса в переменную объекта String, хотя уже сам по себе метод getClassName() принадлежит объекту String....