Добрый день!
Прошу помочь разобраться, а то в голове образовалась путаница.
1) Если взять статью про StackTrace то там указано, что стек хранит в себе вызываемые методы, после завершения метода, удаляет его из себя и нам дан пример:
public class ExceptionExample
{
public static void main(String[] args)
{
method1();
}
public static void method1()
{
method2();
}
public static void method2()
{
method3();
}
public static void method3()
{
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
for (StackTraceElement element : stackTraceElements)
{
System.out.println(element.getMethodName());
}
}
}
насколько я понимаю, массив StackTraceElement[] должен содержить [0 - main, 1 - method1, 2 - method2, 3 - method3, 4 - getStackTrace], после получения стека и вывода на экран через for each, массив должен быть выведен от 0 к последнему элементу и должен дать результат:
Должно быть Есть на самом деле
main getStackTrace
method1 method3
method2 method2
method3 method1
getStackTrace main
Почему так, что я не понимаю? =)
2) В задаче:
package com.javarush.task.task09.task0902;
/*
И снова StackTrace
*/
public class Solution {
public static void main(String[] args) {
method1();
}
public static String method1() {
method2();
return Thread.currentThread().getStackTrace()[2].getMethodName();
//напишите тут ваш код
}
public static String method2() {
method3();
return Thread.currentThread().getStackTrace()[2].getMethodName();
//напишите тут ваш код
}
public static String method3() {
method4();
return Thread.currentThread().getStackTrace()[2].getMethodName();
//напишите тут ваш код
}
public static String method4() {
method5();
return Thread.currentThread().getStackTrace()[2].getMethodName();
//напишите тут ваш код
}
public static String method5() {
return Thread.currentThread().getStackTrace()[2].getMethodName();
//напишите тут ваш код
}
}
Почему стек каждого методы с элементом массива 2, содержит метод который его вызвал, на примере 4 метода, насколько я понимаю, стек массив должен иметь в себе [0 - main, 1 - method1, 2 - method2, 3 - method3, 4 - method4] и 2 элемент стека будет method2, который не является методом, который вызвал method4.
Объясните, пожалуйста, на пальцах)
3) Задача на стек трейс длиной 10 вызовов так же запутала:
package com.javarush.task.task09.task0904;
/*
Стек-трейс длиной 10 вызовов
*/
public class Solution {
public static void main(String[] args) {
int stackTraceLength = method1().length - method10().length + 1;
}
public static StackTraceElement[] method1() {
return method2();
}
public static StackTraceElement[] method2() {
//напишите тут ваш код
return method3();
}
public static StackTraceElement[] method3() {
//напишите тут ваш код
return method4();
}
public static StackTraceElement[] method4() {
//напишите тут ваш код
return method5();
}
public static StackTraceElement[] method5() {
//напишите тут ваш код
return method6();
}
public static StackTraceElement[] method6() {
//напишите тут ваш код
return method7();
}
public static StackTraceElement[] method7() {
//напишите тут ваш код
return method8();
}
public static StackTraceElement[] method8() {
//напишите тут ваш код
return method9();
}
public static StackTraceElement[] method9() {
return method10();
}
public static StackTraceElement[] method10() {
return Thread.currentThread().getStackTrace();
}
}
Почему длина стека первого метода составляет 12, а десятого 3? Насколько я понял, должно быть наоборот, так как до вызова первого метода работают main, StackTrace и method1, а в 10 методе работают main, StackTrace и еще 10 методов.
Буду очень признателен за помощь с разбором этой каши, если возможно, наиболее понятным языком. Спасибо большое.