Что такое стек в java

Стек-трейс Java

Стек-трейс Java - 1

Виртуальная Машина Java (в дальнейшем JVM) обрабатывая код, запускает методы один за другим, начиная с метода main . Когда она доходит до очередного метода, говорится, что этот метод находится на вершине стека. После полного выполнения метода, он удаляется из стека, и сменяется следующим в очереди. Для демонстрации принципа, наберите данный код: У нас три метода: метод main , метод m1 и метод m2 . Когда программа стартует, на вершине стека расположен метод main . Внутри метода main , вызывается метод m1 . Вызываясь, он прыгает на верхушку стека. Метод m1 в свою очередь вызывает метод m2 . Теперь уже метод m2 , прыгает на верхушку стека, временно отстраняя m1 . На секунду представьте это — main , сверху m1 и на вершине m2 ! Сделав свои дела, m2 завершается, и контроль возвращается обратно к m1 . Метод m1 , завершаясь, тоже удаляется из стека, и управление вновь получает метод main . Запустите вашу программу и посмотрите на окно вывода: Метод Main успешно запущен Первый метод передаёт привет!(m1) Второй метод передаёт привет(m2) Метод Main заканчивает свою работу Если что-то пойдёт не так в методе m2 , JVM (Виртуальная Машина Джава, вы помните, да?) будет искать обработчиков ошибок, например блок try … catch . Если в методе m1 обработчика ошибок нет, то исключение будет передано методу m1 , в надежде, что он сумеет её обработать. Если и здесь не обнаружит обработчика ошибок,то исключение снова перейдёт по стеку вверх, на этот раз в метод main . Если метод main не взаимодействует с исключением, вы получите странное сообщение об ошибке, напечатанное в окне вывода. В качестве примера, приведите ваш метод m2 к следующему виду: Этот метод содержит ошибку деления на ноль. А вот полный вариант программы, сверьтесь со своим: Запустите программу и посмотрите, что выдаст вам окно вывода: Метод Main успешно запущен Первый метод передаёт привет!(m1) Exception in thread «main» java.lang.ArithmeticException: / by zero at errorhandling.errorChecking.m2(<u>errorChecking.java:17</u>) at errorhandling.errorChecking.m1(<u>Solution.java:11</u>) at errorhandling.errorChecking.main(<u>>Solution.java:5</u>) Process finished with exit code 1 Вы смотрите на нечто, называемое стек-трейс. Три строки, подчёркнутые голубым, ссылаются на ваши методы, и могут быть найдены в: имя_пакета.имя_класса.имя_метода Первая сверху строка — это место, где ошибка возникла — в методе m2 . Java проследила, что бы она была обработана ArithmeticException , которая вылавливает ошибки деления на ноль. В методах m2 , m1 и main нет обработчика ошибок. Так что программа обработала её обработчиком ошибок по-умолчанию. Измените ваш метод m1 на следующий: Теперь мы обернули метод m2 в блок try . В части catch , мы используем тип исключения, что был выявлен в стек-трейсе — ArithmeticException . Запустите код снова, и в окне вывода увидите следующее: Метод Main успешно запущен Первый метод передаёт привет!(m1) / by zero Метод Main заканчивает свою работу Заметьте, что сообщение об ошибке вывелось как: «/ by zero«. Метод m2 не был выполнен полностью, а был остановлен, когда возникла ошибка. Затем контроль был передан обратно m1 . Это произошло благодаря тому, что блок catch сам распознавал ошибку, JVM не стала обращаться к стандартному обработчику ошибок, а вывела сообщение находящееся между фигурными скобками блока catch . Обратите внимание, что сама программа не была остановлена. Контроль, как обычно перешёл к методу main , откуда m1 был вызван. И последняя строка метода main , таки смогла вывести на экран «End Main method«. Это имеет очень-очень важное значение. Если бы вам нужно было значение из m1 , для последующей работы где-то в main . И если значения там не окажется, то ваша программа может отработать совсем не так, как вы ожидаете. Когда вы увидите стек-трейс в окне вывода, просто знайте, что первая строка — это то место, где проблема возникла, а остальные строки (если конечно они есть), куда исключение было передано вверх по стеку, обычно заканчивая методом main . Перевод с сайта homeandlearn.co.uk Говорим спасибо: Серегею Сысоеву, Treefeed.

What is a stack trace, and how can I use it to debug my application errors?

для инфы: номера методов в стеке
0 — getStackTrace — сам трейсер
1 — имя метода (свое имя)
2 — имя метода кто вызвал [1] — всегда2.
3 — имя метода кто вызвал [2]
4 — и т.д.

stack[2].getMethodName(); — получаем имя вызывающего метода
stack[2].getLineNumber(); — получаем строку в вызвавшем методое
stack[2].getClassName(); — получаем имя класса

Не "отбрасывайте" нижние строки. Из них видно, что IDE запускает из своего класса свой же main, который, используя рефлексию (посмотрите на методы invoke и reflect из sun-библиотеки), в свою очередь, запускает ваш main.

Что такое хороший стек / cms для внутренней сети на базе Java? [закрыто]

Он должен иметь совместимую с debian / ubuntu лицензию.

Ответов: 4

Hippo CMS — это лицензия Apache, поэтому в этом смысле вам предоставлен вариант. Если вы хотите начать работу, перейдите по ссылке : http://www.onehippo.org/

Я читал, что Liferay является одним из лучших порталов с открытым исходным кодом на Java. Также он специально разработан для использования на предприятии.

Также он лицензируется по лицензии MIT.

Все зависит от ваших конкретных потребностей, но без дополнительных деталей я бы добавил Alfresco, Nuxeo и Exo в ваш список.

Класс Stack в Java

Класс стека в Java является частью платформы Collection, которая упрощает различные операции, такие как push, pop и т. д.

Что такое класс Stack в Java?

Класс Stack в Java – это структура данных, которая следует за LIFO (Last In First Out). Java Stack Class подпадает под базовую платформу Collection Hierarchy Framework, в которой вы можете выполнять базовые операции, такие как push, pop и т. д.

Мы знаем, что инфраструктура Java collection включает в себя интерфейсы и классы. Теперь давайте разберемся, как этот класс организован в иерархии инфраструктуры коллекций Java.

класс стек в иерархии

В приведенной выше иерархии синий прямоугольник относится к различным интерфейсам, а желтый прямоугольник определяет класс. Стек в Java расширяет векторный класс, который дополнительно реализует интерфейс List. Всякий раз, когда вы создаете стек, изначально он не содержит какого-либо элемента, т. е. Стек пуст.

Методы

В Java в основном существует 5 методов класса стека.

Метод Описание
empty() Проверяет, пуст ли стек
push() Ставит элемент в верх стека
pop() Удаляет объект из стека
peek() Рассматривает объект стека, не удаляя его
search() Поиск элемента для получения его индекса

Давайте разберемся с каждым из этих методов на программном примере:

Empty stack: []
push(4)
Current Stack: [4]
push(8)
Current Stack: [4, 8]
push(9)
Current Stack: [4, 8, 9]
Element on stack top: 9
Element not found
Element is found at position 3
pop = 9
Remaining stack: [4, 8]
pop = 8
Remaining stack: [4]
pop = 4
Remaining stack: []
pop = empty stack

Объяснение: В приведенной выше Java-программе я сначала напечатал пустой стек и добавил несколько элементов, используя метод Push. Как только элементы присутствуют в стеке, я отобразил элементы сверху стека, используя метод Peek.

После этого я выполнил поиск с использованием метода Search и, наконец, удалил элементы в классе Java Stack с помощью метода Pop.

Размер стека

Вывод: Is the Java Stack empty? false
Size of Stack : 3

Перебор элементов стека на Java

  • Итерация по стеку с использованием iterator()
  • Перебор стека с использованием Java 8 forEach()
  • Перебор стека с использованием listIterator() сверху вниз

Давайте начнем перебирать элементы с помощью iterator().

Точно так же вы можете выполнить итерацию другими методами.

Вывод: итерация стека с помощью forEach():

Итерация с использованием listIterator() сверху вниз:

Объяснение: В приведенном выше коде вы можете увидеть итерацию с помощью метода forEach(), а затем повернуть ее с помощью listIterator() сверху вниз в стеке.

Средняя оценка / 5. Количество голосов:

Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *