Java Scanner try catch 多种数据类型

标签 java try-catch

首先感谢你们在堆栈溢出上所做的一切。它帮助了我很多很多次! 我今天的问题是与 Scanner 一起使用 try/catch 指令的一个小问题。看看我将产品添加到食谱的方法:

public static void addProducts(List<Product> product, Scanner sc)
{
    if (run == true)
    {
        Maths calc = new Maths();
        //Some instructions in Polish, not needed here :)
        while (true)
        {
            String name = null;
            double quantity = 0;
            double pricePerUnit = 0;
            try
            {
                name = sc.nextLine();
                if (name.equals("0") || name.equals("exit"))
                {
                    Logic.run = false;
                    break;
                }
                quantity = sc.nextDouble();
                sc.nextLine();
                pricePerUnit = sc.nextDouble();
                sc.nextLine();

                product.add(new Product(product.size() + 1, name, calc.round(quantity, 2), calc.round(pricePerUnit, 2)));
                System.out.println("Product added: " + "\n" + product.get(product.size() - 1));
            } catch (InputMismatchException e)
            {
                System.out.println("Error! Please repeat your last input.");
            }
        }
        double num = 0;
        for (Product p : product)
        {
            num += p.getPrice();
        }
        Maths.setTotalPrice(num);
        System.out.println("Total: " + num);

    } else
    {
        System.out.println("You have already added products to the recipe!");
    }
}

正如你所看到的,我在 try/catch 指令中读取 String、double 和 double 。例如,当在食谱中添加“土 bean ”时,我不小心在应该是数量的地方写了“马”,我得到了名为“马”而不是“土 bean ”的产品。明白了吗?我这里有一只黄鸭,但用我的母语解释比用英语更容易:) 如果有什么不清楚的地方我会尽力解释,谢谢!

最佳答案

当你这样做时:

quantity = sc.nextDouble();
sc.nextLine();

您将丢弃任何额外的输入,而无需确认。如果您想限制用户在一行中仅输入数字而不输入其他内容,请使用:

quantity = Double.parseDouble(sc.nextLine()); // maybe add .trim()

如果您保持代码不变,请记住,当引发 InputMismatchException 时,Scanner 仍然位于错误输入(开头),因此您需要丢弃:

} catch (InputMismatchException e)
{
    System.out.println("Error! Please repeat your last input.");
    sc.nextLine(); // discard bad input
}

当然,您的代码将循环并提示所有 3 个输入,因此错误消息有点误导。

关于Java Scanner try catch 多种数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37243682/

相关文章:

Java 链式/嵌套方法调用

java - HttpComponentsMessageSender - 默认最大总连接数

c# - 在 .net 结构构造函数中使用 try-catch

java - "Un-nesting"我的 Java 中的 Try/Catch block

java - 如何在 LDAP 中获取用户的电子邮件 ID

java - 测试 Jersey REST 资源(无效返回响应)

java - 查找另一个字符串中的多个字符串

javascript - 在异步等待中的try-catch中处理 'throw error'是否有问题?

java - 将打印行和文本添加到 FileWriter (writer.write)