Java - Try / Catch NumberFormatException使用以前的值吗?

时间:2016-11-14 03:09:05

标签: 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崩溃。

即。 -

"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"

仅在多次出现异常后才会发生。我很好奇它为什么这样做。关于如何解决这个问题或解释发生了什么的任何建议?如果您需要代码的任何其他部分,请告诉我!谢谢!

2 个答案:

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