int stackTraceLength = method1().length - method10().length + 1;
почему method1().length 12, а не 9?
почему method10().length 3, а не 0?
и что конкретно обозначает .length в этом примере?
Maxim
20 уровень
Почему?
Решен
Комментарии (11)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
--------Master
29 мая 2018, 15:06
Каждый из методов возвращает массив, length - длина соответствующего массива. Чтобы понять, почему длина имеет то или иное значение, достаточно просто вывести содержимое массива на экран или просмотреть в дебаггере
+1
Maxim
29 мая 2018, 15:28
посмотрел вот так
****************
for(int i = 0; i <= method10().length ; i++) {
System.out.println(method10());
}
*********************
показали вот такие ссылки и так же в дебагере
https://gyazo.com/b4b84911a43779e1100f4a9b22cee188
вопрос остался открытым
*************************
пс .возможно я не так вывод делаю массива. прошу меня поправить.
0
--------Master
29 мая 2018, 15:55
Ты 10 раз выводишь на экран системное имя объекта - массива с одним и тем же содержимым (метод Object.toString у массивов не переопределен), а не элементы этого массива с соответствующими индексами.
+1
Maxim
29 мая 2018, 17:01
если method1() это элемент массива,то
мне не понятно массив какого это типа? StackTracerElement?
и как получить доступ к элементам массива.
плюс если method1() это элемент массива как у него может быть .length???
чё то я запутался.
0
--------Master
29 мая 2018, 17:19
Метод возвращает массив объектов класса StackTraceElement, класс позволяет получать информацию о вызовах методов. Для упрощения расписал вывод в две строки, хотя переменную array было можно не объявлять:
0
Maxim
29 мая 2018, 18:32
Спасибо большое за пример. чуть прояснилось, но только с возможностью вывода.
1.возможно я ошибаюсь, но метод1() возвращает СТЭК вложенных в него Методов,
а не Массив Объектов.
2. и разве Метод и Объект это одно и тоже? я думал что объект подразумевает наличие класса-конструктора итд.
3. само слово length вводит в заблуждение. тут скорее слово deep подходит. а то сидишь и думаешь, какая у метода может быть длинна ? :-0
4. я вывел ваш код, я вижу весь стек. но ответа так не получил.
метод1().length значение 12, а метод10().length - 3.
вот 10 он же на вершине стека?
какая у него может быть вложенность? никакой. должно быть 0, ну или 1 если считать с Thread. а там 3 .
я не пойму вот этот момент.
+1
--------Master
29 мая 2018, 20:02
В Яве практически все является классами и объектами со своими свойствами, методами и конструкторами. StackTraceElement - класс, StackTraceElement[] - массив объектов этого класса, StackTraceElement[] method () - метод method, возвращающий массив объектов класса StackTraceElement.
length - длина любого массива, а не метода - метод возвращает значение, а не является этим возвращаемым значением.
Вызывается метод main - в стек (в массив StackTraceElement[]) добавляется объект StackTraceElement, соответствующий методу main, из main вызывается method1 - добавляется элемент method1, ... вызывается method10 - добавляется method10. Из method10 вызывается метод getStackTrace() - добавляется объект, соответствующий getStackTrace, и уже этот метод возвращает полученный стек. Всю эту последовательность вызовов можно наблюдать как раз через вывод массива в консоль.
+3
Maxim
29 мая 2018, 20:30
Спасибо за такой подробный ответ. если бы такие лекции были)
пс. скажем так я тупой, напиши пожалуйста, что имеется ввиду под цифрой 3,
конкретно по отдельности:
что имеется ввиду под 1,
что имеется ввиду под 2,
что имеется ввиду под 3, после вывода в консоль print(method10())?
************************************
"Из method10 вызывается метод getStackTrace() - добавляется объект, соответствующий getStackTrace, и уже этот метод возвращает полученный стек." что и где здесь 1,2 и 3 ?
0
--------Master
29 мая 2018, 20:42
Поясню на примере вывода того же стека:
Вывод в консоль:
Элемент 0 - вызов getStackTrace из method10, элемент 1 - вызов method10 из main, 2 - вызов main, т.е. запуск программы.
Также для понимания ты можешь внутри каких-то из методов с 1 по 10 расставить аналогичный вывод стека перед вызовом следующего метода, понаблюдать как стек заполняется. +2
Maxim
29 мая 2018, 21:01
Спасибо! ВСЁ понял.)
я зациклился на цифре 3. и на начале и конце стэка. а по сути 10+2, 10 методов + в только в начале мэйн и поток.
Хорошо ты меня прокачал. Спасибо ещё раз.
0
Mikhail
30 мая 2019, 23:02
Боже ж ты мой! 3 часа пытался понять почему 12 - 3 + 1 = 10. Почему все это время, я высчитывал это выражение как 12 - (3 + 1)?! Видимо, нужно иногда спать.. Самое забавное, что понимание пришло, когда мне пришла идея заменить минус на плюс ))
Я должен был это написать. Крик души, так сказать.
+2