for循环中加入has判断 就挑跳不出来了,怎么解决?

for循环中加入has判断 就挑跳不出来了,求大佬解答
下面是代码

package shopping;

import java.util.Scanner;

public class jieMian {
    public static void main(String[] args) {
        denglu();

    }

    public static void denglu() {
        //声明
        String name = "admin";
        int num = 123;
        int a;
        System.out.println("\t\t欢迎使用我行我素购物管理系统!");
        System.out.println("\t\t1.登录系统");
        System.out.println("\t\t2.退出");
        System.out.println("***************************************");
        Scanner input = new Scanner(System.in);
        for (; ; ) {
            System.out.println("请选择,输入数字:");
            if (input.hasNextInt()) {
                a = input.nextInt();
                if (a == 1) {
                    for (; ; ) {
                        System.out.println("请输入账号:");
                        String name1 = input.next();
                        System.out.println("请输入密码:");
                        int num1 = input.nextInt();
                        if (name1.equals(name) && num1 == num) {
                            break;
                        } else {
                            System.out.println("用户名密码错误,请重新输入!");
                        }
                    }
                    break;
                } else if (a == 2) {
                    System.out.println("欢迎下次光临!");
                    break;
                } else {
                    System.out.println("输入错误,请重新输入!");
                }
            } else {
                System.out.println("输入错误,请重新输入!");
                continue;
            }
        }
    }
}

通过断点调试是可以看出这个问题,如果想继续输入,可以在改成这种方式

       else {
                System.out.println("输入错误,请重新输入!");
             
                input = new Scanner(System.in);
                continue;
            }

你的hasNextInt在输入字符串后,判断为false,后续的hasNext就会一直为false,你的input会一直是has这个字符

import java.util.Scanner;

/**
 * <p>
 * 解决for循环中加入has判断跳不出来问题
 * </p>
 *
 * @author : zhengqing
 * @description : 通过`input.nextLine();`解决; TODO 注意异常控制! ex: input.nextInt()
 * @date : 2021/1/15 13:48
 */
public class Problem_01 {

    public static void main(String[] args) {
        String username = "admin";
        int password = 123;
        int result;

        System.out.println("\t\t欢迎使用我行我素购物管理系统!");
        System.out.println("\t\t1.登录系统");
        System.out.println("\t\t2.退出");
        System.out.println("***************************************");

        Scanner input = new Scanner(System.in);
        boolean flag = true;
        while (flag) {
            System.out.println("请选择,输入数字:");
            boolean inputContent = input.hasNextInt();
            if (!inputContent) {
                System.out.println("输入错误,请重新输入!");
                input.nextLine();
            }
            if (inputContent) {
                result = input.nextInt();
                switch (result) {
                    case 1:
                        for (;;) {
                            System.out.println("请输入账号:");
                            String usernameByInput = input.next();
                            System.out.println("请输入密码:");
                            int passwordByInput = input.nextInt();
                            if (usernameByInput.equals(username) && passwordByInput == password) {
                                flag = false;
                                System.out.println("登录成功...");
                                break;
                            } else {
                                System.out.println("用户名密码错误,请重新输入!");
                                input.nextLine();
                            }
                        }
                        break;
                    case 2:
                        System.out.println("欢迎下次光临!");
                        flag = false;
                        break;
                    default:
                        System.out.println("输入错误,请重新输入!");
                        input.nextLine();
                        break;
                }
            }
        }
    }

}

 

运行过了,代码没毛病,你说什么跳不出来

输入字符串后hasNextInt是false会调用else,然后之前输出的东西还在输入流里没有被消耗掉

所以循环后调用hasNextInt不会让你输出新的值,而是把原本字符串值直接哪来判断,所以造成死循环

只要把错误的值消耗掉就行了

if (input.hasNextInt()) {
    ...............
} else {
    // 读取之前输入的值
    String b = input.next();
    System.out.println("输入错误,请重新输入!");
    continue;
}