初学者:catch中抛出的异常;实现一个循环? - Java

时间:2014-05-12 00:20:30

标签: java

开发类似于创建收据的程序。它需要扫描仪输入:名称和价格。尝试使用try-catch来解决双重不会输入价格扫描器的情况。管理以使其工作,但仅限于抛出异常一次;如果我在catch块内再次给出错误的输入,它将失败。我该怎么做让程序处理catch中的异常?我也只是一个小孩学习我可以获得的任何免费资源,所以这里的错误可能只是基本问题/糟糕的编码实践,并希望也指出这些。

谢谢!

以下是代码:

        Scanner scanPrice = new Scanner(System.in);
        System.out.println("Enter the cost: ");
        try {
            priceTag = scanPrice.nextDouble();
        } catch (InputMismatchException e) {
            System.out.println("Only numbers. Enter the cost again.");
            scanPriceException = new Scanner(System.in);
            priceTag = scanPriceException.nextDouble();
        }

        costs[i] = priceTag;

2 个答案:

答案 0 :(得分:3)

这是因为您的trycatch块只运行一次。如果需要重试直到成功,则需要将其置于循环中。只需更改代码块:

    Scanner scanPrice = new Scanner(System.in);
    System.out.println("Enter the cost: ");
    try {
        priceTag = scanPrice.nextDouble();
    } catch (InputMismatchException e) {
        System.out.println("Only numbers. Enter the cost again.");
        scanPriceException = new Scanner(System.in);
        priceTag = scanPriceException.nextDouble();
    } 

要:

    Scanner scanPrice = new Scanner(System.in);
    while (true) {
        System.out.println("Enter the cost: ");
        try {
            priceTag = scanPrice.nextDouble();
            break;
        } catch (InputMismatchException e) {
            System.out.println("Only numbers. Enter the cost again.");
            scanPrice.next();
        }
    }

如果try上有break,则InputMismatchException数据块将无法到达nextDouble语句。

编辑:忘记添加,但您还需要丢弃旧输入,以便它不会再次引发异常。因此最后是scanPrice.next()。有关详细信息,请参阅此答案:How to handle infinite loop caused by invalid input using Scanner

答案 1 :(得分:3)

此处, while( true 表示在您的扫描仪未获得所需输入(在这种情况下为双倍值)之前,它会一直询问您#34; 仅限数字。再次输入费用。"。 扫描仪获得正确输入的那一刻,那么在这种情况下没有" InputMismatchException "将被抛出并且try块中的break语句将被执行,这将使你的程序控制在 while 循环之外。