扫描程序在主方法中关闭异常

时间:2013-11-30 17:04:45

标签: java loops try-catch java.util.scanner finally

有人可以用我的主要方法向我突出问题吗?一旦我完成第一个选项并尝试输入另一个选项,我收到扫描程序关闭的错误异常?

我认为我遇到的问题是来自我的尝试捕获的位置,最后阻止但不完全确定!谢谢!

/**
 * Scanner used for input within program
 */
public static Scanner scanner = new Scanner(System.in);

/**
 * Main method that provides user with a menu in which each number
 * represents a different task in which they can carry out
 */
public static void main(String[] args) {



int menuOption=0;
do{ 
    try {

        // Declaring var for user Input (defaulted to 0)
        menuOption = showMenu();
        switch (menuOption) {

        case 1:
            add();
            break;
        case 2:
            subtract();
            break;
        case 3:
            generateRandomNumber();
            guessRandomNumber();
            break;
        case 4: // invoke print loop method (use params here to get
                // experience!)
            break;
        case 5: // invoke print sum and average
            break;
        case 6: System.out.println("Quitting Program...");
            break;
        default:
            System.out.println("Sorry, please enter valid Option");

        }// End of switch statement

    } catch (Exception ex) {
        //flush scanner
        scanner.next();
    }

    finally {
        // Finally block ensures scanner is always closed
        scanner.close();
    }

}while(menuOption!=6);

//Exiting message
System.out.println("Thanks for using this Program...");

5 个答案:

答案 0 :(得分:0)

问题是在循环的第一次迭代中,您正在关闭finally块中的扫描程序。即使未捕获异常,finally块也会每次都关闭。

答案 1 :(得分:0)

我猜你正在使用程序流的异常(并且在那里抓住了所有内容!)?别。例外是非常昂贵的,并且将它们用于程序流程会使代码混乱很多。

您在scanner.next()声明中使用catch:这将要求新输入。 但由于finally块在catch之后立即执行,因此您将立即关闭它。

finally块将执行,无论是否有异常。它旨在清理资源,但是你太早清理它们。

删除try-catch(或使其更合适)并且不要在finally块中关闭扫描仪。

答案 2 :(得分:0)

关闭循环外的扫描仪,摆脱最后的

do {
   ...
} while (...)

scanner.close();

答案 3 :(得分:0)

现在您的控制流程看起来像这样

do {
    try {
        //read from scanner
    }
    finally {
        scanner.close();
    }
} while (menuOption != 6);

但这会在第一次迭代后关闭扫描仪。

您可能应该将do...while()移到try{...}块内。

try {
    do{
        //read from scanner
    }
    while (menuOption != 6);
}
finally {
    scanner.close();
}

这样,确保关闭扫描仪的finally块将在循环之外。

答案 4 :(得分:-1)

也许你得到一个例外,然后在最后的

中输入了捕获的代码

托盘以查看您是否进入了捕获区