Java扫描程序尝试捕获多个数据类型

Java扫描程序尝试捕获多个数据类型,java,try-catch,Java,Try Catch,首先,感谢你们在堆栈溢出上所做的一切。它帮助了我很多次! 我今天的问题是try/catch指令与扫描仪一起使用的一个小问题。请看一下我在配方中添加产品的方法: public static void addProducts(List<Product> product, Scanner sc) { if (run == true) { Maths calc = new Maths(); //Some instructions in Poli

首先,感谢你们在堆栈溢出上所做的一切。它帮助了我很多次! 我今天的问题是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!");
    }
}
公共静态无效添加产品(列表产品、扫描仪sc)
{
if(run==true)
{
数学计算=新数学();
//一些波兰语说明,此处不需要:)
while(true)
{
字符串名称=null;
双倍数量=0;
双倍价格单位=0;
尝试
{
name=sc.nextLine();
if(name.equals(“0”)| name.equals(“退出”))
{
Logic.run=false;
打破
}
数量=sc.nextDouble();
sc.nextLine();
pricePerUnit=sc.nextDouble();
sc.nextLine();
product.add(新产品(product.size()+1,名称,计算轮数(数量,2),计算轮数(价格单位,2)));
System.out.println(“添加的产品:”+“\n”+Product.get(Product.size()-1));
}捕获(输入不匹配异常e)
{
System.out.println(“错误!请重复上次输入。”);
}
}
双数=0;
对于(产品p:产品)
{
num+=p.getPrice();
}
数学。设置总价格(num);
System.out.println(“总计:+num”);
}否则
{
System.out.println(“您已经将产品添加到配方中了!”);
}
}
正如您所看到的,我正在读取字符串,try/catch指令中的double和double。例如,在配方中添加“土豆”时,我意外地写下了“马”,其中的数量应该是多少,我得到的是一种名为“马”而不是“土豆”的产品。清楚了吗?我这里有一只黄色的鸭子,但用我的母语比用英语更容易解释:) 如果有什么不清楚的地方,我会尽力解释,谢谢

当您这样做时:

quantity = sc.nextDouble();
sc.nextLine();
您正在丢弃任何额外的输入,而不进行确认。如果要限制用户只在一行中输入数字而不输入其他内容,请使用:

quantity = Double.parseDouble(sc.nextLine()); // maybe add .trim()
如果代码保持不变,请记住,当抛出
inputmaschException
时,
Scanner
仍停留在错误输入的开头,因此您需要放弃:

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

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

您可以使用
if(run)
而不是
if(run==true)
。只需确认:您的输入是否每项有3行?名称、数量、价格?是否有错误?什么不起作用?@Bohemian-是的,没错。产品有它的名称、数量和价格。@sebenalem-工作正常,但我失去了输入如果我输入错误的数据类型时出错,请重新阅读帖子:)我在使用Double.parseDouble时不得不将catch(InputMismatchException e)改为catch(java.lang.NumberFormatException e),但我的问题仍然存在。当我在输入数量时发现错误时,我丢失了我所给出的名称。我知道唯一的方法是告诉用户重复整个产品。是这样吗?或者我应该为我输入的每一个数据将一个try/catch分成三个吗?不,您不必重新开始。回到开头,创建3个循环,每个值一个,而不是一个循环:一个好的助手方法可能会很好,以减少重复代码。