2015-06-13 3 views
0

Я запускаю программу на Java, и она не заканчивается в течение длительного времени. Я думаю, это может быть бесконечный цикл в коде, но я не вижу код (не могу его изменить).Как обнаружить бесконечный цикл в Java?

Как судить об этом в бесконечном цикле или нет?

Это вопрос с интервью, и мой ответ - это компьютерный компьютер (счетчик программ) находится в цикле или нет. Но интервьюер дал мне подсказку use stack and heap of that program ...

+1

Используйте инструмент отладки, если вы используете IDE, например Eclipse или Netbeans. –

+0

Используйте профиль java и проверьте статистику. –

+5

Скажите ему, что если бы вы знали ответ, вы бы сделали шаг вперед, чтобы стать знаменитым (http://pt.wikipedia.org/wiki/P_versus_NP). –

ответ

3

В теории вы не можете. Это проблема с остановкой.

На практике вы можете проверить циклы в стеке вызовов. Java должна произойти сбой после того, как закончится нехватка памяти и выгрузите трассировку стека. Это утомительно, возможно, полезно.

+0

Re: «Это проблема с остановкой»: это как бы противоположность проблемы остановки; проблема остановки только дает вам источник программы (и вход), тогда как эта проблема позволяет вам наблюдать за запущенной программой, но не дает вам * источник *. (Но даже в этом случае, я согласен, это не будет возможно во всех случаях.) – ruakh

+0

Байт Java-кода математически эквивалентен инструкциям машины Тьюринга (кроме машины Тьюринга имеет бесконечную память). Итак, «источник» есть. Но вы не найдете никаких «циклов в стеке вызовов», когда вы находитесь в бесконечном цикле. Если это сильно рекурсивно, да, но в цикле в стеке вызовов не обязательно что-то происходит. –

+0

Но проблема с остановкой не говорит о том, что вы никогда не сможете сказать, останавливается ли программа или нет (независимо от того, находится ли она в бесконечном цикле, перефразировать свободно или это не так). Проблема остановки просто говорит о том, что вы не можете написать программу, которая всегда * способна рассказывать. Поэтому теоретически вы, конечно, можете сказать, во многих случаях, просто не во всех случаях. –

-7

Я думаю, вы могли бы использовать метод try/catch.

ex.

попробовать {

} поймать (Exception е) { System.err.println ("Infinte Loop Detcted:");

+7

Что?!?!?!?!?!?!?! –

+2

Попробуйте предсказание: сжечь макароны и вызвать летающего монстра-спагетти, и он скажет вам, бесконечна ли петля или нет. Он работает одинаково хорошо, как указано выше. –

+3

Если бы бесконечная петля сделала исключение, она остановилась бы, что означает, что она не будет бесконечной в первую очередь. – Boann