试图提示用户从catch块重新进入,但catch块终止了吗?
我正在尝试编写一个程序,要求用户输入他们的年龄并提示他们重新输入,如果他们输入了不正确的值(例如负数,年龄超过120,年龄有特殊字符或字母,范围号等…)
我尝试写一个try / catch来要求用户重新输入他们的年龄:
System.out.println("Enter your age (a positive integer): "); int num; try { num = in.nextInt(); while (num 120) { System.out.println("Bad age. Re-enter your age (a positive integer): "); num = in.nextInt(); } } catch (InputMismatchException e) { //System.out.println(e); System.out.println("Bad age. Re-enter your age (a positive integer): "); num = in.nextInt(); }
当输入的年龄包含特殊字符/字母或超出范围时,程序会打印出“Bad age。重新输入您的年龄(正整数)”,但此后会立即终止此错误:
Exception in thread "main" java.util.InputMismatchException at java.base/java.util.Scanner.throwFor(Unknown Source) at java.base/java.util.Scanner.next(Unknown Source) at java.base/java.util.Scanner.nextInt(Unknown Source) at java.base/java.util.Scanner.nextInt(Unknown Source) at Age.main(Age.java:21)
我的目标是让程序继续提示有效年龄,直到用户获得正确的年龄。 我真的很感激任何反馈和帮助。 我是java初学者:)谢谢
我试图改变把整个代码放到while循环中然后它会导致无限循环…请帮忙!
while (num 120) { try { System.out.println("Bad age. Re-enter your age (a positive integer): "); num = in.nextInt(); } catch (InputMismatchException e) { System.out.println("Bad age. Re-enter your age (a positive integer): "); } }
由于您尝试捕获无效的输入状态,同时仍然提示用户输入正确的值,因此try-catch
应作为其validation过程的一部分封装在loop
中。
使用nextInt
读取输入时,不会删除无效输入,因此您需要确保在尝试使用nextLine
重新读取缓冲区之前清除缓冲区。 或者你可以放弃它,直接使用nextLine
读取String
值,然后使用Integer.parseInt
将其转换为int
,这个人就不那么麻烦了。
Scanner scanner = new Scanner(System.in); int age = -1; do { try { System.out.print("Enter ago between 0 and 250 years: "); String text = scanner.nextLine(); // Solves dangling new line age = Integer.parseInt(text); if (age < 0 || age > 250) { System.out.println("Invalid age, must be between 0 and 250"); } } catch (NumberFormatException ime) { System.out.println("Invalid input - numbers only please"); } } while (age < 0 || age > 250);
使用do-while
循环,主要是因为,即使第一遍中的有效值,您也必须至少迭代一次
即使您能够提示用户重新输入他的年龄,您也无法检查输入是否正确。 因此,我建议使用一个简单的while循环,就像你正在做的那样,但不是只查找一个数字范围,在尝试解析int之前检查它是否是一个数字。
如果你使用input.nextLine()。trim(); 例如,您可以使用StringUtils.isNumeric之类的方法,或者您可以实现自己的方法来返回一个布尔值,指示输入是否为数字。
- URI方案不是“文件”
- 获取exceptionorg.apache.logging.slf4j.SLF4JLoggerContext无法强制转换为org.apache.logging.log4j.core.LoggerContext
- javax.naming.NoInitialContextException – Java
- 读取xlsx文件时出现apache POIexception
- JSF 1.2动作exception和actionListener之间的区别
- 文件存在时具有所有权限的FileNotFoundException
- javax.persistence.NoResultException:getSingleResult()没有检索任何实体
- Java catch块,捕获exception不是最终的
- 每个例外都有必要的试用吗?