这是练习:
如果输入是有效的成绩编号,程序应打印"确定"。 否则,程序应该打印输入的值,而#34;不是a 有效等级。"并再次提示成绩编号。该计划应该保持 询问成绩数字,直到用户输入有效的成绩编号。
示例输出:
输入成绩(0-5):9
9不是有效等级
输入等级(0-5):两个
两个不是有效的等级
输入等级(0-5):2
好的
我使用'尝试抓住'在while循环中使用NumberFormatException。但是,我不能像示例中的第二个那样打印输出。我的输出就像:
输入成绩(0-5):9
9不是有效等级
输入等级(0-5):两个
9不是有效等级
输入等级(0-5):2
好的
新输入'两个'没有保存。我该如何解决这个问题?
以下是我的代码:
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("Enter grade (0-5): ");
int grade = Integer.parseInt(input.nextLine());
if (0 <= grade && grade <= 5) {
System.out.print("OK");
} else {
while (grade < 0 || grade > 5) {
try {
System.out.println(grade + " is not a valid grade.");
System.out.print("\n");
System.out.print("Enter grade (0-5): ");
grade = Integer.parseInt(input.nextLine());
} catch (NumberFormatException nfe) {
System.out.println( " is not a valid grade.");
System.out.print("\n");
System.out.print("Enter grade (0-5): ");
grade = Integer.parseInt(input.nextLine());
}
}
System.out.print("OK");
}
}
答案 0 :(得分:4)
如果grade
的值为9
且输入为"two"
,此行会发生什么?:
grade = Integer.parseInt(input.nextLine());
该行将抛出异常。但更重要的是,这一行将不将字符串值"two"
分配给整数变量grade
。
将输入存储在字符串中。类似的东西:
String gradeInput = input.nextLine();
int grade = Integer.parseInt(gradeInput);
如果此操作抛出异常,则输入无效。如果它没有抛出异常但grade
超出了要求范围,则输入无效。但这两种情况都需要单独测试。
此外,请注意您的第一个输入解析是在try / catch之外。所以它可能完全失败。考虑这样的结构:
Scanner input = new Scanner(System.in);
String gradeInput;
int grade = -1;
while (grade < 0 || grade > 5) {
try {
System.out.print("Enter grade (0-5): ");
gradeInput = input.nextLine();
grade = Integer.parseInt(gradeInput);
if (grade < 0 || grade > 5) {
System.out.println(gradeInput + " is not a valid grade.");
System.out.print("\n");
}
} catch (NumberFormatException nfe) {
System.out.println(gradeInput + " is not a valid grade.");
System.out.print("\n");
}
}
我想有很多种方法可以将它们组合在一起并重构以尝试减少这里重复的几行。但问题是,您不要想要重复接受输入并将其解析为整数的行,就像您当前的代码一样。因为如果在catch
或try/catch
之外完全抛出异常,则系统将失败。尝试从字符串解析整数值需要在try
块中。