Java:在Do-While循环中使用Try-Catch语句

6
我正在尝试执行一段代码,用于扫描用户输入值。这个动作包含在我编写的一个自定义方法中,名为getTriangleDim(); 该方法读取用户输入的int值,确保它在特定范围内,然后返回输入的int值。该方法运行良好,没有任何问题。
当我在getTriangleDim()方法中输入一个非int值时,问题就出现了。它会给我一个InputMismatchException错误。我已经在do-while循环中编写了try-catch语句,以尝试解决此问题。但这是我第一次使用try-catch语句,显然我遗漏了一些东西。
以下是嵌套在do-while循环中的try-catch语句的代码:
//loop to scan for triangle dimension
        boolean bError = true;
        int triangle;

        do{
            try {
                triangle = getTriangleDim();
                bError=false;
                }
            catch (Exception e){
                System.out.println("You did not enter an integer, please enter an integer value");
                triangle = getTriangleDim();

                }
        }while (bError);

如果我用char值替换int进行测试,它会捕获错误并打印我的“you did not.....”语句。但是如果我重新输入另一个非int数字,我再次得到一个运行时错误,它说.......你猜对了........ InputMismatchException error。

我的方法代码如下:

//method for scanning triangle dimensions from keyboard
    public static int getTriangleDim(){
        int triangle = 0;
        Scanner keyboard = new Scanner(System.in);
        do{
        System.out.print("Enter a non-zero integer length (+/-1 - +/-16): ");
        triangle = keyboard.nextInt();
        if((!(triangle <= 16 && triangle >= 1))&&(!(triangle >= -16 && triangle <= -1)))
            System.out.println("Inpute value outside of range");
        }while((!(triangle <= 16 && triangle >= 1))&&(!(triangle >= -16 && triangle <= -1)));
        return triangle;
    }

我需要 Do-While 循环继续执行,但是我一直遇到这些错误。


你可以定义一个新的异常类 class NotIntegerException extends Exception { .. } 并在外部捕获它,以区分它与其他类型的异常。 - Khaled.K
1个回答

2
catch块中没有必要请求输入。因为你已经在一个循环中了,所以你可以捕获异常,告诉用户提供有效的输入,然后你就不需要做任何其他事情——你会回到开始循环的地方。
do{
    try {
        triangle = getTriangleDim();
        bError=false;
    } catch (Exception e){
        System.out.println("You did not enter an integer, please enter an integer value");
        // Don't do anything else in here: we will loop back to the beginning again and get new input!
    }
}while (bError);

作为一个旁注(正如您已经注意到的那样),如果您尝试在那个try块之外使用triangle,则您的代码目前无法编译,因为"triangle might not have been initialized"。这是由于编译器无法在编译时确定程序在运行时会做什么:也就是说,编译器无法看到triangle将始终在循环内初始化。因此,您的变量声明还应将triangle设置为某个默认值。0int的正常默认值,但请根据您的程序使用任何有意义的值(根据您的getTriangleDim代码,0似乎很好)。
int triangle = 0;
do { // etc.

这样,您可以“承诺”编译器,在离开循环时triangle将有一个值,这样您就可以在其他地方使用它。

谢谢,我现在感觉有点傻。我更新了我的代码,删除了catch块中的scanner输入。但是现在我遇到了一个不同的错误,编译器给出了以下错误:“无法编译的源代码-变量triangle可能尚未初始化”。此外,在我的Do-while循环和嵌套的try-catch语句之后,对traingle变量的每个引用都被用红色下划线标出。我不明白,似乎我的程序没有意识到它已经被初始化为一个值? - user2993456
1
@Adam 编译器不会说谎! 可以看到在退出循环时应该初始化,但编译器无法预测程序的运行方式。就编译器而言,你可能能够在不初始化 triangle 的情况下离开循环。请参阅此问题以获取类似于您的示例,但重点是您必须将 triangle 初始化为某个默认值(0-1 是常见的)进行实际赋值的循环之前(例如 int triangle = 0;)。 - Henry Keiter
谢谢!我很感激你的帮助。 - user2993456

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接