Java尝试捕获(InputMismatchException)意外循环

Java尝试捕获(InputMismatchException)意外循环,java,error-handling,try-catch,Java,Error Handling,Try Catch,我试图捕获一个输入不匹配异常它在第一次中断时工作,但是当再次调用menu()方法时,它开始循环,直到陷入错误 在try catch中,我的目标是获取一条错误消息,然后再次启动菜单()方法 我有以下代码: public class Menu extends ProfilesManager { static Scanner sc = new Scanner(System.in); public static void menu() { int number;

我试图捕获一个
输入不匹配异常
它在第一次中断时工作,但是当再次调用
menu()
方法时,它开始循环,直到陷入错误

try catch
中,我的目标是获取一条错误消息,然后再次启动
菜单()
方法

我有以下代码:

public class Menu extends ProfilesManager {
    static Scanner sc = new Scanner(System.in);

    public static void menu() {

        int number;
        System.out.println("** Welcome... **\n  ");
        System.out.println("* what you wanna do?:\n");
        System.out.println("(1) Login  \n(2) Register  \n(3) Find User  \n(4) Exit\n");
        System.out.print("-Answer?: ");

        try {
            number = sc.nextInt();            
            if (number == 1) {
                Login();
            } else if (number == 2) {
                Register(); 
            } else if (number == 3) {
                FindUser(); 
            } else if (number== 4) {
                Exit();
            }                                                    
        } catch (InputMismatchException e) {   
            System.out.println("Error , only numbers!!");
            menu();           
            } 
        }
    }
}

你有无限递归。如果要再次调用,必须将menu()移出catch块。否则它是无限循环。

您有无限递归。如果要再次调用,必须将menu()移出catch块。否则它就是无限循环。

我想你应该写
sc=newscanner(System.in)
after
System.out.println(“错误,仅数字!!”)

我想你应该写
sc=newscanner(System.in)
after
System.out.println(“错误,仅数字!!”)

这是因为一旦输入错误。您没有清除它,
Scanner
将继续读取它,每次它都会给您
输入不匹配异常

你需要在你的拦网中清除它

}catch(InputMismatchException e){

    System.out.println("Error , only numbers!!");
    sc.nextLine();
    // Put 2 second delay
    try{
         Thread.sleep(2000);
    }catch(InterruptedException ex){
       ex.printStackTrace();
    }
    menu();

} 

这是因为一旦输入了错误的输入。您没有清除它,
Scanner
将继续读取它,每次它都会给您
输入不匹配异常

你需要在你的拦网中清除它

}catch(InputMismatchException e){

    System.out.println("Error , only numbers!!");
    sc.nextLine();
    // Put 2 second delay
    try{
         Thread.sleep(2000);
    }catch(InterruptedException ex){
       ex.printStackTrace();
    }
    menu();

} 

什么是
menuPrinc()?如果您想重新启动某些东西,请使用实际循环,而不是递归。我想您只需在
catch
blockmenuPrinc()中调用
menu()
,这是menu()方法,我忘了更正它,抱歉!什么是
menuPrinc()?如果您想重新启动某些东西,请使用实际循环,而不是递归。我想您只需在
catch
blockmenuPrinc()中调用
menu()
,这是menu()方法,我忘了更正它,抱歉!唯一的问题是,错误信息看不见,它直接跳转而不显示。这是因为错误信息和菜单显示是快速连续的。。要缓解此问题,您可以将
Thread.sleep
放在
menu
调用之前。唯一的问题是无法看到错误消息,它会直接跳转而不显示。这是因为错误消息和菜单显示是快速连续的。。要缓解此问题,您可以在调用
菜单之前放置
线程.sleep