Если написать так :
try {
ingredients.put(null, 100);
} catch (Exception e) {
printBugMethodName(e.getStackTrace());
}
вместо :
try {
ingredients.put(null, 100);
} catch(Exception e)
printBugMethodName(Thread.currentThread().getStackTrace());
}
то валидатор не принимает решение
MichaelKosm
16 уровень
В чем тогда разница ?
Решен
Комментарии (13)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
MichaelKosm
19 января 2021, 11:24
В том что даный метод принимает только первый елемент массива?
public static void printBugMethodName(StackTraceElement[] stackTraceElements) {
StackTraceElement stackTraceElement = stackTraceElements[1];
System.out.println(stackTraceElement.getMethodName());
}
0
Ksenia VolkovaJava Developer в DXCMaster
19 января 2021, 11:28
У исключения свой стектрейс, он зависит от того, что это за ошибка, где она исходно возникла. Это может быть совсем другой класс и метод.
+3
gwin
25 января 2021, 11:20
Вот именно.. Читаем условие задачи - Если сделаешь все правильно, при запуске программы на экран выведутся имена методов, в которых возникает исключение. Поэтому передавать в метод printBugMethodName(e.getStackTrace()) более корректный вариант
+1
VasilyD
3 февраля 2021, 13:44
Ксения, всё-таки не очень понятно, в чём принципиальное отличие? Вот отладчик выдаёт практически одинаковые стектрейсы.
В каком случае они будут отличаться? Может, где-то поподробнее разбор разных примеров посмотреть?
e.getStackTrace() = {StackTraceElement[4]@505}
0 = {StackTraceElement@486} "java.util.TreeMap.put(TreeMap.java:563)"
1 = {StackTraceElement@487} "com.javarush.task.pro.task14.task1413.Solution.addJuice(Solution.java:48)"
2 = {StackTraceElement@488} "com.javarush.task.pro.task14.task1413.Solution.makeScrewdriver(Solution.java:25)"
3 = {StackTraceElement@489} "com.javarush.task.pro.task14.task1413.Solution.main(Solution.java:14)"
Thread.currentThread().getStackTrace() = {StackTraceElement[4]@506}
0 = {StackTraceElement@509} "java.lang.Thread.getStackTrace(Thread.java:1559)"
1 = {StackTraceElement@510} "com.javarush.task.pro.task14.task1413.Solution.addJuice(Solution.java:50)"
2 = {StackTraceElement@511} "com.javarush.task.pro.task14.task1413.Solution.makeScrewdriver(Solution.java:25)"
3 = {StackTraceElement@512} "com.javarush.task.pro.task14.task1413.Solution.main(Solution.java:14)"
0
Ksenia VolkovaJava Developer в DXCMaster
3 февраля 2021, 14:00
Расскажи, пожалуйста, как ты из 2-го стектрейса поймешь, где возникла ошибка?
0
VasilyD
3 февраля 2021, 14:51
Второй (который Thread.currentThread - правильное решение по версии JavaRush) указывает на строку уже в обработчике catch, а первый (трейс от эксепшна) - как раз на строку, в которой возникла ошибка (вызов метода addJuice с некорректным параметром null, т.е. как мне кажется, первый вариант (трейс исключения) - более информативный. Могу ошибаться, только начал учиться ))
![]()

+4
Ksenia VolkovaJava Developer в DXCMaster
3 февраля 2021, 14:59
Мне не видно ни самих требований задачи, ни исходного кода - поэтому мне трудно сказать, что там имеется в виду.
0
VasilyD
3 февраля 2021, 15:23
Спасибо в любом случае, помогла сформулировать для себя правильные вопросы 🍻
0
EkaterinaLvova
6 февраля 2021, 16:12
При вызове printBugMethodName(e.getStackTrace()); выдается название метода в методе, который в данном случае кладет значение в коллекцию, т.е. "put".
0
MichaelKosm
19 января 2021, 11:22
В Idea все работает одинаково. В каком случае можно увидеть разницу? Не совсем понятно..
0
Ksenia VolkovaJava Developer в DXCMaster
19 января 2021, 10:48
Разница в том, что стектрейсы разные.
+1
gwin
25 января 2021, 11:14
Всё равно не понимаю почему не валидно решение:
try {
ingredients.put(null, 100);
} catch (Exception e) {
printBugMethodName(e.getStackTrace());
}
Мы отлавливаем текущую ошибку е, которая попала в блок catch (Exception e). И у этой ошибки вызываем стектрейс - e.getStackTrace(). Какие в данной ситуации могут быть разные стектрейсы??? Он будет всегда один - только для текущей ошибки
0
MichaelKosm
27 января 2021, 00:34
Заметил такое дело:
если передать e.getStackTrace() в метод printBugMethodName ,
если использовать при этом вывод System.out.println(stackTraceElement.getLineNumber()); в методе printBugMethodName
то выведет собственно номер строки где мы и ловим исключение,
а если передать - Thread.currentThread().getStackTrace() , то выводит номер собственно этой строки , даже не смотря на то что в printBugMethodName
StackTraceElement stackTraceElement = stackTraceElements[1];
Поскольку нулевой елемент массива stackTraceElements[0] это должен содержать инфу относительно самого getStackTrace(); , чето типа того...
Стектрейсы разные , наверное в данном случае конектнее использовать e
0