Java - Try/Catch NumberFormatException 使用以前的值?
Java - Try/Catch NumberFormatException uses a former value?
首先 post 如果做错了,我深表歉意(我对编程也比较陌生,因此也欢迎任何无关的提示)。
所以我在 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"
只有在多次出现异常后才会出现。我很好奇为什么要这样做。关于如何解决这个问题的任何建议或对正在发生的事情的解释?如果您需要代码的任何其他部分,请告诉我!谢谢!
我没有完全理解你所说的,但是这两行(来自你的 catch
块)看起来有问题...
spaceTestAndConvert(numInput.trim());
return Double.parseDouble(numInput.trim());
您正在递归调用 spaceTestAndConvert
函数,但丢弃了该值。我不明白为什么你会调用它并且对值不感兴趣。
第二行也是乱七八糟。您非常小心地用 try/catch 包围了对 Double.parseDouble()
的第一次调用,但随后您在 catch
块中再次调用它。如果第二个Double.parseDouble()
生成一个NumberFormatException
,就不会被抓到
删除 catch 中的 return 将解决您的问题。因为如果你有 return,你将 return 一个无效的数字格式,因为你陷入困境。你想要做的是 return 一个现在有效的值,你现在实际上是在 try 中做的。不要强迫你的程序 return 有错误的值(因为它在捕获中)因为它真的会给你一个错误。
return 在获得正确的值(由于递归)后转到上一个方法,除了从结束部分获得的成功值之外,仍然会有错误值堆栈,因为它们是不同的变量。
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());
}
}
首先 post 如果做错了,我深表歉意(我对编程也比较陌生,因此也欢迎任何无关的提示)。
所以我在 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"
只有在多次出现异常后才会出现。我很好奇为什么要这样做。关于如何解决这个问题的任何建议或对正在发生的事情的解释?如果您需要代码的任何其他部分,请告诉我!谢谢!
我没有完全理解你所说的,但是这两行(来自你的 catch
块)看起来有问题...
spaceTestAndConvert(numInput.trim());
return Double.parseDouble(numInput.trim());
您正在递归调用 spaceTestAndConvert
函数,但丢弃了该值。我不明白为什么你会调用它并且对值不感兴趣。
第二行也是乱七八糟。您非常小心地用 try/catch 包围了对 Double.parseDouble()
的第一次调用,但随后您在 catch
块中再次调用它。如果第二个Double.parseDouble()
生成一个NumberFormatException
,就不会被抓到
删除 catch 中的 return 将解决您的问题。因为如果你有 return,你将 return 一个无效的数字格式,因为你陷入困境。你想要做的是 return 一个现在有效的值,你现在实际上是在 try 中做的。不要强迫你的程序 return 有错误的值(因为它在捕获中)因为它真的会给你一个错误。
return 在获得正确的值(由于递归)后转到上一个方法,除了从结束部分获得的成功值之外,仍然会有错误值堆栈,因为它们是不同的变量。
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());
}
}