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());
}
}