开发类似于创建收据的程序。它需要扫描仪输入:名称和价格。尝试使用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;
答案 0 :(得分:3)
这是因为您的try
和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();
}
要:
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 循环之外。