Прежде всего, не ловите Exception. Делая это, вылавливает практически все возможные исключения, включая все виды вещей, которые вы не должны ловить ... потому что вы не ожидаете их, и вы не знаете, как от них избавиться.
Во-вторых, если вы поймали исключение, которого вы не ожидаете, вам нужно как-то выяснить, что это было и чем оно вызвано. Первым шагом является печать (или запись в журнал) трассировки стека.
В-третьих, если вы получили трассировку стека, вам нужно прочитать, что там написано. Или, по крайней мере, показать это кому-то, кто может прочитать то, что он говорит. (Например, нам!)
Так что же на самом деле происходит?
Ну, есть несколько возможных объяснений, и вот некоторые из них:
Если input
равно null
, тогда
Calc.input.nextDouble();
бросит NullPointerException
. Если вы поймаете это исключение и попробуете снова (как вы делаете), это зациклится.
Если следующий токен во входном потоке сканера НЕ является действительным двойным, то nextDouble()
сгенерирует InputMismatchException
, не пройдя мимо токена . Если вы поймаете и повторите попытку, вы получите то же самое исключение ... и вы будете зацикливаться.
Здесь могут быть и другие исключения, которые могут привести к тому же результату; например NoSuchElementException
и IllegalStateException
.
Другой сценарий состоит в том, что вы можете зацикливаться из-за
Calc.main(null);
вызов в конце метода. Это, скорее всего, вызовет вашу точку входа Calc
классов снова ... вызывая цикл.
Теперь трассировка стека от вашего переполнения стека должна позволить вам различать некоторые из них, и добавление e.printStacktrace()
к обработчику даст больше.
Задача: попробуйте сделать это / прочитать трассировку стека, чтобы посмотреть, сможете ли вы решить эту проблему для себя !
... так что я понимаю, что я должен привести к двойному значению
Нет. Переменная input
предположительно равна Scanner
. Вы не можете разыграть Scanner
с удвоением.
Исходя из того, что я сказал выше, я / мы не можем (пока) сказать вам, что вам нужно сделать, чтобы это исправить. Но первый шаг - распечатать трассировку стека и прочитать ее!
Но что Double.parseDouble(Calc.input.next())
не может сделать Calc.input.nextDouble()
.
Они используют разные правила синтаксиса:
Scanner
анализирует числа в соответствии с синтаксисом, который зависит от текущих настроек локали; см javadoc .
Double.parseDouble
анализирует числа согласно нечувствительному к локали синтаксису; см javadoc .
Этого может быть достаточно, чтобы строка была действительной в одном случае, а не в другом. Это зависит от строки, которую вы пытаетесь проанализировать ... и вашего языка.