6

我正在尝试执行一些扫描用户输入值的代码。此操作包含在我编写的自定义方法中,名为 getTriangleDim(); 该方法读取用户的 int 值,确保它在一定范围内,然后返回输入的 int 值。该方法效果很好,我对此没有任何问题。

当我为我的 getTriangleDim() 方法输入一个非整数值时,就会出现问题。它给了我一个 InputMismatchException 错误。我已将 try-catch 语句写入 do-while 循环以尝试解决此问题。但这是我第一次使用 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 来测试它,它实际上会捕获一次错误,然后打印我的“你没有......”语句。但是,如果我重新输入另一个非整数数字,我会再次收到运行时错误,提示......你猜对了...... InputMismatchException 错误。

我的方法的代码在这里:

//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 循环才能继续,但我不断收到这些错误。

4

1 回答 1

1

无需在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);

作为旁注(正如您已经注意到的),如果您尝试triangle在该块之外使用,您的代码当前不会编译try,因为"triangle might not have been initialized". 这是因为编译器无法在编译时确定您的程序将在运行时做什么:也就是说,编译器看不到triangle将始终在该循环中初始化。所以你的变量声明也应该设置triangle为一些默认值。0是 的正常默认值,但请使用您的程序中有意义的任何内容(根据您的代码,int它看起来很好)。0getTriangleDim

int triangle = 0;
do { // etc.

这样,您可以“承诺”在triangle您离开循环时将具有值的编译器,并且您将能够在其他地方使用它。

于 2014-02-25T04:56:23.853 回答