2014-02-08 2 views
0

В настоящее время я просматриваю мой OCPJP 6 с помощью Sierra & Bates рецензент. Я наткнулся на вопрос о бесконечном цикле, не бросающем StackOverflowError. Насколько я узнал, он должен бросить его в конце концов.Java: бесконечный цикл в конечном итоге приводит к StackOverflowError?

Пожалуйста, обратитесь к этому PDF на вопрос: https://java.net/downloads/jfjug/SCJP%20Sun%20Certified%20Programmer%20for%20Java%206-0071591060.pdf

Вопрос Я имею в виду от Self Test Глава 5 Вопрос 9 (стр 455 из PDF).

Я ответил, CDF. Правильный ответ, согласно книге, был DF. Также было объяснено, что случай 0 инициирует бесконечный цикл, а не StackOverflowError.

Правда, он инициирует бесконечный цикл, но в конечном итоге оказывается StackOverflowError. В ответе C говорилось, что «может вызвать StackOverflowError», поэтому я знал, что C был прав.

Если я ошибаюсь, может кто-нибудь объяснить, почему?

+3

Этот 'for (;;);' бесконечный цикл. Почему это должно вызвать 'StackOverflowError'? Все больше и больше занимает стек на каждой итерации? –

+1

Бесконечный (или даже конечный с высоким) рекурсивный вызов приводит к переполнению стека, а не к циклу. –

+0

Offtopic, но вы знаете, что PDF-файл предназначен для сертифицированного Java-сертифицированного Java-программиста, который больше не существует как таковой? Oracle разделила это на две различные сертификаты. – eis

ответ

5

Поскольку в этом цикле вы фактически не вызываете методы, которые нужно вызвать другими методами (a la recursion), вы не добавляете больше вызовов в стек. Вы просто повторяете шаги, которые вы делали чаще всего.

С a StackOverflowError вызывается только в определенных условиях, а именно при вызове другого метода (который вызовет больше методов) или выделения большего количества элементов в стек, тогда действительно нет способа, чтобы этот конкретный цикл мог вызвать такие ошибка.

+0

Спасибо за разъяснение! Должно быть, я пропустил это. – mpmp

2
The stack overflows is commonly :- excessively deep or infinite recursion. 
In simple terms,for an example: calling a method within a method. 

     public static void proneToStackOverFlow() { 
     proneToStackOverFlow(); 
     } 

     public static void main(String[] args) 
     { 
      proneToStackOverFlow(); 
     }