处理无效用户输入时停止无限循环 - Java
Stop infinite Loop when handling invalid user input - Java
我是编程新手,当我尝试处理 InputMisMatch
异常时,我的程序不断循环遇到问题。
我有一个菜单,它接受用户输入,然后使用 switch 语句来处理输入。我试图让我的程序处理两个异常。首先是确保输入实际上是一个整数,其次确保整数在菜单的范围内。我在 try 块中使用了 NextInt() 方法。 try 块内部是 switch 语句,它使用默认大小写来处理不在范围内的输入
然而,当用户输入非整数输入时的 catch 块不断循环。看来我还没有在某个地方更新循环内的用户输入,但我对在哪里更新它感到困惑。
目前,我不关心 switch case 中的内容(尽管我也想在它们内部实现相同的循环功能),这只是外循环的逻辑。
这是我的代码:
任何指导将不胜感激。谢谢!
public class Main {
// set up scanner for user input
public static Scanner keyboard = new Scanner(System.in);
public static void main(String[] args) {
// welcome message
welcome();
//declare user choice variables
int menuSelection;
int discSelection;
boolean isInputValid = true ;
do { // keep looping until user input is valid
try {
/*
We can expect an error from user input
1. Input is not an integer
2. Input is not in range
*/
isInputValid = true;
displayMainMenu();
menuSelection = keyboard.nextInt();
System.out.println(); //print new line
//Menu Logic
switch (menuSelection) {
case 0: { // Exit Application
break;
}
case 1: { // Search
searchDiscMenu(); //Display the search menu
discSelection = keyboard.nextInt(); // get user choice
if (discSelection == 1) {
System.out.println("Disc.Music.searchMusic()");
} else if (discSelection == 2) {
System.out.println("Disc.Game.searchGame()");
}
break;
}
case 2: { // Add
addDiscMenu(); //Display add menu
discSelection = keyboard.nextInt(); // get user choice
if (discSelection == 1) {
System.out.println("Disc.Music.addMusic()");
} else if (discSelection == 2) {
System.out.println("Disc.Game.addGame();");
}
break;
}
case 3: { // Remove
removeDiscMenu(); //Display remove menu
discSelection = keyboard.nextInt(); // get user choice
if (discSelection == 1) {
System.out.println("Disc.Music.removeMusic();");
} else if (discSelection == 2) {
System.out.println("Disc.Game.removeGame();");
}
break;
}
case 4: { // View
viewDiscMenu(); //Display view menu
discSelection = keyboard.nextInt(); // get user choice
if (discSelection == 1) {
System.out.println("Disc.Music.viewMusic();");
} else if (discSelection == 2) {
System.out.println("Disc.Music.viewMusic();");
}
break;
}
case 5: { // Sort
sortDiscMenu(); //Display sort menu
discSelection = keyboard.nextInt(); // get user choice
if (discSelection == 1) {
System.out.println("Disc.Music.viewMusic();");
} else if (discSelection == 2) {
System.out.println("Disc.Music.viewMusic();");
}
break;
}
case 6: { // Write
writeDiscMenu(); //Display write menu
discSelection = keyboard.nextInt(); // get user choice
if (discSelection == 1) {
System.out.println("Disc.Music.viewMusic();");
} else if (discSelection == 2) {
System.out.println("Disc.Game.writeGameFile();");
}
break;
}
case 7: { // Read
readDiscMenu(); //Display read menu
discSelection = keyboard.nextInt(); // get user choice
if (discSelection == 1) {
System.out.println("Disc.Music.readMusicFile();");
} else if (discSelection == 2) {
System.out.println("Disc.Game.readGameFile();");
}
break;
}
default: { // Handle exception
isInputValid = false;
System.out.println("Error: Selection Not In Range"); // If the input is an int but not in range
break;
}
}
} catch (InputMismatchException e) { // Handles user typing in a char, double etc. instead of int
isInputValid = false;
System.out.println("Error: Unrecognised Input");
}
} while (!isInputValid);
// Exit application safely
System.out.println("Finished"); // temporary message
}
如果您使用这样的方法来检查您的输入会更好:
public int rangeInt(int lower_boundary, int upper_boundary) {
int inp = -1;
try {
Scanner in = new Scanner(System.in);
inp = in.nextInt();
in.nextLine();
if (inp < lower_boundary || inp > upper_boundary) {
throw new InputMismatchException();
}
} catch (InputMismatchException e) {
System.err.println("Please enter integer between " + lower_boundary + " and " + upper_boundary);
inp = rangeInt(lower_boundary, upper_boundary);
}
return inp;
}
此方法处理 InputMismatchException
和 returns 您传递的整数之间的整数
之所以会发生这种情况,是因为 nextInt()
在控制台中按 Enter 键输入内容时不会消耗缓冲区中插入的换行符。
为了克服这个问题,您可以将 keyboard.nextLine()
添加到 catch 块,这样您就可以使用缓冲区中插入的新行字符并将其清除到下一个输入。
正如其他人所说,您应该将输入 hadling 包装在一个方法中,因为您的 nextInt
不会被您的 InputMismatchException
捕捉到。如果需要,所述方法应调用 nextInt()
捕获异常,如果不是 returns 用户输入,则使用 nextLine()
清除换行字符的缓冲区。
这样你就可以保证你总是会发现那个错误。
我是编程新手,当我尝试处理 InputMisMatch
异常时,我的程序不断循环遇到问题。
我有一个菜单,它接受用户输入,然后使用 switch 语句来处理输入。我试图让我的程序处理两个异常。首先是确保输入实际上是一个整数,其次确保整数在菜单的范围内。我在 try 块中使用了 NextInt() 方法。 try 块内部是 switch 语句,它使用默认大小写来处理不在范围内的输入
然而,当用户输入非整数输入时的 catch 块不断循环。看来我还没有在某个地方更新循环内的用户输入,但我对在哪里更新它感到困惑。
目前,我不关心 switch case 中的内容(尽管我也想在它们内部实现相同的循环功能),这只是外循环的逻辑。
这是我的代码:
任何指导将不胜感激。谢谢!
public class Main {
// set up scanner for user input
public static Scanner keyboard = new Scanner(System.in);
public static void main(String[] args) {
// welcome message
welcome();
//declare user choice variables
int menuSelection;
int discSelection;
boolean isInputValid = true ;
do { // keep looping until user input is valid
try {
/*
We can expect an error from user input
1. Input is not an integer
2. Input is not in range
*/
isInputValid = true;
displayMainMenu();
menuSelection = keyboard.nextInt();
System.out.println(); //print new line
//Menu Logic
switch (menuSelection) {
case 0: { // Exit Application
break;
}
case 1: { // Search
searchDiscMenu(); //Display the search menu
discSelection = keyboard.nextInt(); // get user choice
if (discSelection == 1) {
System.out.println("Disc.Music.searchMusic()");
} else if (discSelection == 2) {
System.out.println("Disc.Game.searchGame()");
}
break;
}
case 2: { // Add
addDiscMenu(); //Display add menu
discSelection = keyboard.nextInt(); // get user choice
if (discSelection == 1) {
System.out.println("Disc.Music.addMusic()");
} else if (discSelection == 2) {
System.out.println("Disc.Game.addGame();");
}
break;
}
case 3: { // Remove
removeDiscMenu(); //Display remove menu
discSelection = keyboard.nextInt(); // get user choice
if (discSelection == 1) {
System.out.println("Disc.Music.removeMusic();");
} else if (discSelection == 2) {
System.out.println("Disc.Game.removeGame();");
}
break;
}
case 4: { // View
viewDiscMenu(); //Display view menu
discSelection = keyboard.nextInt(); // get user choice
if (discSelection == 1) {
System.out.println("Disc.Music.viewMusic();");
} else if (discSelection == 2) {
System.out.println("Disc.Music.viewMusic();");
}
break;
}
case 5: { // Sort
sortDiscMenu(); //Display sort menu
discSelection = keyboard.nextInt(); // get user choice
if (discSelection == 1) {
System.out.println("Disc.Music.viewMusic();");
} else if (discSelection == 2) {
System.out.println("Disc.Music.viewMusic();");
}
break;
}
case 6: { // Write
writeDiscMenu(); //Display write menu
discSelection = keyboard.nextInt(); // get user choice
if (discSelection == 1) {
System.out.println("Disc.Music.viewMusic();");
} else if (discSelection == 2) {
System.out.println("Disc.Game.writeGameFile();");
}
break;
}
case 7: { // Read
readDiscMenu(); //Display read menu
discSelection = keyboard.nextInt(); // get user choice
if (discSelection == 1) {
System.out.println("Disc.Music.readMusicFile();");
} else if (discSelection == 2) {
System.out.println("Disc.Game.readGameFile();");
}
break;
}
default: { // Handle exception
isInputValid = false;
System.out.println("Error: Selection Not In Range"); // If the input is an int but not in range
break;
}
}
} catch (InputMismatchException e) { // Handles user typing in a char, double etc. instead of int
isInputValid = false;
System.out.println("Error: Unrecognised Input");
}
} while (!isInputValid);
// Exit application safely
System.out.println("Finished"); // temporary message
}
如果您使用这样的方法来检查您的输入会更好:
public int rangeInt(int lower_boundary, int upper_boundary) {
int inp = -1;
try {
Scanner in = new Scanner(System.in);
inp = in.nextInt();
in.nextLine();
if (inp < lower_boundary || inp > upper_boundary) {
throw new InputMismatchException();
}
} catch (InputMismatchException e) {
System.err.println("Please enter integer between " + lower_boundary + " and " + upper_boundary);
inp = rangeInt(lower_boundary, upper_boundary);
}
return inp;
}
此方法处理 InputMismatchException
和 returns 您传递的整数之间的整数
之所以会发生这种情况,是因为 nextInt()
在控制台中按 Enter 键输入内容时不会消耗缓冲区中插入的换行符。
为了克服这个问题,您可以将 keyboard.nextLine()
添加到 catch 块,这样您就可以使用缓冲区中插入的新行字符并将其清除到下一个输入。
正如其他人所说,您应该将输入 hadling 包装在一个方法中,因为您的 nextInt
不会被您的 InputMismatchException
捕捉到。如果需要,所述方法应调用 nextInt()
捕获异常,如果不是 returns 用户输入,则使用 nextLine()
清除换行字符的缓冲区。
这样你就可以保证你总是会发现那个错误。