Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有catch语句和崩溃的无限循环方法_Java_Try Catch - Fatal编程技术网

Java 带有catch语句和崩溃的无限循环方法

Java 带有catch语句和崩溃的无限循环方法,java,try-catch,Java,Try Catch,我正在写一个程序来确定一次旅行的汽油里程。但是,我希望确保用户不会在提示时输入字符串或字符,并确保用户输入双精度字符。我设置了一个try/catch,就像在其他没有问题的程序中一样,但这一个给了我问题。但是程序不断循环通过该方法,然后崩溃。我试着把它放在一个while循环中,并试着把每个输入放在一个单独的try-catch中,但没有成功 private static double[] gas(){ double gasCost[] = new double[3]; System.

我正在写一个程序来确定一次旅行的汽油里程。但是,我希望确保用户不会在提示时输入字符串或字符,并确保用户输入双精度字符。我设置了一个try/catch,就像在其他没有问题的程序中一样,但这一个给了我问题。但是程序不断循环通过该方法,然后崩溃。我试着把它放在一个while循环中,并试着把每个输入放在一个单独的try-catch中,但没有成功

private static double[] gas(){
    double gasCost[] = new double[3];
    System.out.println("********************************************************");
    System.out.print("What is the current price of gas per gallon, ie...2.84: $");
    try{
        gasCost[0] = input.nextDouble();
        System.out.print("On average, how many miles to the gallon does your vehicle get, ie...22.5: ");
        gasCost[1] = input.nextDouble();
        gasCost[2] = gasCost[0] / gasCost[1];             
    } catch (Exception e) {
        System.out.println("\nERROR!! Invalid input, please try again!\n");
        gas();
    }
    return gasCost;
}

为了调试的目的,将此添加到您的代码中,您将清楚地看到它一直失败的原因:

try{
    //...         
} catch (Exception e) {
    System.err.println(e.toString()); // < added this
    System.out.println("\nERROR!! Invalid input, please try again!\n");
    gas();
}
你的气体法:

private static Gas gas(){
    //...

    return new Gas(cost, mileage);
}

确保在每次调用input.nextDouble()后调用input.nextLine(),以清除用户在键入其双精度值后输入的行尾字符。以递归方式调用此方法是一个非常糟糕的主意™. 试着在纸上仔细思考当抛出异常时会发生什么,您将立即看到原因。(或使用调试器进行尝试。)当
nextDouble()
抛出
inputmaschException
时,它实际上不会超过令牌。您必须调用
next()
跳过无效的输入。使用此方法可以帮助您从用户->公共静态双精度getDoubleFromUserWithPrompt(扫描仪输入,字符串提示){double val=double.NaN;boolean validDouble=false;String userInput=“”;而(!validDouble){System.out.println(提示)try{userInput=input.nextLine();val=Double.parseDouble(userInput);validDouble=true;}catch(异常e){System.out.println(“无效的双输入:”+userInput);System.out.println(“重试…”);}}返回val;}@biziclop那么你的措辞很奇怪。您实际上试图声明“那个bug是个坏主意”。“您的代码包含bug”可能更清楚。无论如何,我要删除我的评论,因为这不是建设性的。
private static Gas gas(){
    //...

    return new Gas(cost, mileage);
}