在catch块中,我正在尝试纠正用户输入错误的问题。在测试它时,如果我使用“break”关键字,它不会跳转到最初的问题。如果我使用“继续”,它会无限循环。 “Sc.next();”似乎也没有解决它。
这是代码的相关部分。
public class ComputerAge {
private static int age;
private static int year;
private static int month;
private static int date;
private static Calendar birthdate;
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
System.out.print("Enter the numeral representing your birth month: ");
do {
try {
month = sc.nextInt();
} catch (InputMismatchException ime){
System.out.println("Your respone must be a whole number");
break;
}
} while (!sc.hasNextInt());
答案 0 :(得分:3)
您的方法存在的问题是,当您致电sc.nextInt()
并引发异常时,Scanner
会 提升其阅读位置。您需要通过调用sc.next()
块内的catch
而不是break
来推进阅读指针:
do {
try {
month = sc.nextInt();
} catch (InputMismatchException ime){
System.out.println("Your respone must be a whole number");
sc.next(); // This will advance the reading position
}
} while (!sc.hasNextInt());
答案 1 :(得分:3)
为了解决问题,我们应该确定最终要完成的目标 我们希望月份是数字月份,即数字> 0
<强>因此:强>
month
将被填写。month
将保持为'0'。结论:我们希望我们的程序在月份等于0时继续运行。
解决方案非常简单:
条件应该是:
while (month == 0);
您应该将break
更改为sc.next()
。
答案 2 :(得分:2)
我认为你应该使用无限循环,当输入正确时(没有抛出异常),使用break
完成循环:
public static void main(String args[])
{
System.out.print("Enter the numeral representing your birth month: ");
do {
try {
int month = sc.nextInt();
break;
} catch (InputMismatchException ime) {
System.out.println("Your respone must be a whole number");
sc.nextLine();
}
} while (true);
}
此外,您必须在sc.nextLine()
块中使用catch
,因为当您输入一些输入并按 Enter 时,会添加换行符,并且{ {1}}不读它。您必须使用nextInt()
来使用该字符。有关此问题的更多信息you could read this。
答案 3 :(得分:2)
首先,你必须避免在迭代句中使用try / catch来提高性能。
你可以通过这种方式重新编码休息时间(请记住de do-while至少会执行一次,所以如果你的扫描程序检索空值,你将拥有nullPointer)
try {
while (sc != null && !sc.hasNextInt()) {
month = sc.nextInt();
}
} catch (InputMismatchException ime){
System.out.println("Your respone must be a whole number");
}
答案 4 :(得分:1)
确保您可以先获取整数,然后使用正则表达式。如果可能,请不要使用异常来强制执行代码逻辑。
int month;
boolean correct = false;
while (!correct && sc.hasNextLine())
{
String line = sc.nextLine();
if (!line.matches("^[0-9]+$"))
{
System.out.println("Your response must be a whole number");
correct = false;
}
else
{
month = Integer.parseInt(line);
correct = true;
}
}