首先感谢你们在堆栈溢出上所做的一切。它帮助了我很多很多次! 我今天的问题是与 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/