使用Java中的do-while循环进行异常处理

时间:2017-02-16 19:09:01

标签: java loops arraylist exception-handling do-while

算法应该将3个整数带入ArrayList。如果输入不是整数,那么应该有一个提示。当我执行我的代码时,执行catch子句,但程序运行到无限循环。有人可以引导我走向正确的方向,我很感激帮助。 :-D

package chapter_08;
import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;

public class IntegerList {
    static List<Integer> numbers = new ArrayList<Integer>();

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int counter = 1;
        int inputNum;

        do {
            System.out.print("Type " + counter + " integer: " );
            try {
                inputNum = input.nextInt();
                numbers.add(inputNum);
                counter += 1;
            }
            catch (Exception exc) {
                System.out.println("invalid number");
            }
        } while (!(numbers.size() == 3));
    }
}

5 个答案:

答案 0 :(得分:3)

这是因为当使用nextInt()读取下一个int并且它失败时,Scanner仍然包含键入的内容。然后,当重新进入do-while循环时,input.nextInt()会尝试使用相同的内容再次解析它。

您需要使用Scanner

“刷新”nextLine()内容
catch (Exception exc) {
    input.nextLine();
    System.out.println("invalid number");
}

备注:

  • 您可以删除counter变量,因为您没有使用它。否则,您可以将counter += 1替换为counter++
  • 您可以将while (!(numbers.size() == 3))替换为while (numbers.size() != 3),甚至更好:while (numbers.size() < 3)
  • 在捕获异常时,您应该尽可能具体,除非您有充分的理由不这样做。在您的情况下,Exception应替换为InputMismatchException

答案 1 :(得分:1)

如果inputNum = input.nextInt();无法适合int并且引发InputMismatchException,则不会消耗Scanner的输入。

所以在捕获之后,它会循环并再次出现在这里:

inputNum = input.nextInt();

在输入中具有完全相同的内容。

因此,您应该在catch语句中执行input.nextLine();以丢弃当前输入并允许来自用户的新输入。
此外,捕捉InputMismatchException而不是Exception更有意义,因为其他异常可能与不匹配无关,如果不是,则向用户"invalid number "显示没有用处问题:

    catch (InputMismatchException e){
        System.out.println("invalid number ");
        input.nextLine();
    }

答案 2 :(得分:0)

您应该在break;中使用catch(){},如此:

try {
    inputNum = input.nextInt();
    numbers.add(inputNum);
    counter += 1;
} catch (Exception e) {
    System.out.println("invalid number ");
    break;
}

因此,如果一个输入不正确,请断开循环。

答案 3 :(得分:0)

尝试更改

inputNum = input.nextInt();

String inputText=input.next();
inputNum = Integer.valueOf(inputText);

效果非常好。

答案 4 :(得分:0)

您需要将扫描仪移动到下一行。在catch部分的错误消息下面添加这行代码。

input.nextLine();