第一篇文章,所以我很抱歉,如果这样做不正确(而且对编程也相对较新,所以任何多余的提示也会受到赞赏)。
所以我用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崩溃。
即。 -
"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 :(得分:2)
我不会关注你所说的一切,但是这两行(来自catch
区块内)看起来有问题......
spaceTestAndConvert(numInput.trim());
return Double.parseDouble(numInput.trim());
您正在递归调用spaceTestAndConvert
函数,但丢弃该值。我不明白为什么你会打电话给它,而不是对价值感兴趣。
第二行也是一团糟。您使用try / catch小心地围绕第一次调用Double.parseDouble()
,然后再在catch
块中再次调用它。如果第二个Double.parseDouble()
生成NumberFormatException
,则不会被捕获。
答案 1 :(得分: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());
}
}