2016-11-14 2 views
0

Первое сообщение, так что мои извинения, если это было сделано неправильно (и я также относительно новичок в программировании, поэтому любые посторонние подсказки также оценены).Java - Try/Catch NumberFormatException использует прежнее значение?

Итак, я написал базовую программу калькулятора на Java. В настоящее время он работает хорошо, но у меня есть особая проблема с NumberFormatException. Вот код:

private static double spaceTestAndConvert(String numInput){ 

    Scanner input= new Scanner(System.in); 

    if (numInput.equalsIgnoreCase("quit")){ 
     System.exit(1); 
    } 
    else if(numInput.equalsIgnoreCase("C/E")){ 
     Restart(); 
    } 

    try{ 
     return Double.parseDouble(numInput.trim()); 
    } 
    catch(NumberFormatException nfe){ 
     numInput = ""; 
     System.out.println("Please enter only one number without any spaces or letters: "); 
     numInput = input.nextLine(); 
     spaceTestAndConvert(numInput.trim()); 
     return Double.parseDouble(numInput.trim()); 
    } 
} 

Вопрос заключается в том, что после того, как пытается заставить ошибку, введя в несколько входов, которые будут вызывать NumberFormatException, а затем ввести в правильный ввод, программа даст сбой из NumberFormatException со ссылкой на предыдущий некорректный вход ,

I.E. -

"1 2 3" 
loops back 
"1 2 q 3" 
loops back 
"12q3 3 sqw 1" 
loops back 
"12" 
crash - Exception in thread "main" java.lang.NumberFormatException: For input string: "12q3 3 sqw 1" 

Это происходит только после нескольких случаев исключения. Мне любопытно, почему это делается. Любые советы о том, как исправить это или объяснить, что происходит? Если вам нужна какая-либо другая часть кода, пожалуйста, дайте мне знать! Благодаря!

+0

Сбой при вводе «3 12q3»? – Matt

+1

Вы имели в виду сказать return spaceTestAndConvert (numInput.trim())? – kirbyquerby

+0

Нет. По крайней мере, не первая попытка войти в нее. Я ввел его несколько раз, а затем ввел действительный ввод, и он разбился (как в примере в вопросе). @kirby - Nah. Нужно, чтобы он разбирал строку в двойную, как только я получу допустимый ввод. И вернуть эту ценность. –

ответ

2

Я не слежу за всем, что вы говорите, но эти 2 строки (из вашего catch блока) выглядят проблематично ...

spaceTestAndConvert(numInput.trim()); 
return Double.parseDouble(numInput.trim()); 

Вы вызываете функцию spaceTestAndConvert рекурсивно, но выбрасывание Значение. Я не понимаю, почему вы бы назвали это и не интересовались значением.

Вторая линия также беспорядок. Вы так тщательно окружаете первый вызов Double.parseDouble() с помощью try/catch, но затем вы вызываете его снова в своем блоке catch. Если второй Double.parseDouble() генерирует NumberFormatException, он не будет пойман.

+0

Спасибо, Дрю! Это была проблема. Первый раз, используя try/catch (и рекурсия, если на то пошло), но все это исправлено и работает. –

+0

Да. Замените эти две строки 'return spaceTestAndConvert (numInput.trim());' и все будет работать плавно. –

0

удаление возврата в уловке решит вашу проблему. потому что, если у вас есть возврат на него, вы будете возвращать недопустимый формат чисел, так как вы находитесь в catch. То, что вы хотите сделать, - это вернуть значение, когда оно теперь действует, теперь вы фактически делаете это внутри try. Не заставляйте свою программу возвращать значение с ошибкой (поскольку оно находится в catch), потому что это действительно даст вам ошибку.

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

private static double spaceTestAndConvert(String numInput){ 

Scanner input= new Scanner(System.in); 

if (numInput.equalsIgnoreCase("quit")){ 
    System.exit(1); 
} 
else if(numInput.equalsIgnoreCase("C/E")){ 
    Restart(); 
} 

try{ 
    return Double.parseDouble(numInput.trim()); 
} 
catch(NumberFormatException nfe){ 
    numInput = ""; 
    System.out.println("Please enter only one number without any spaces or letters: "); 
    numInput = input.nextLine(); 
    spaceTestAndConvert(numInput.trim()); 
} 
}