Scanner使用出现的问题及解决办法

Java的Scanner扫描器中nextInt()和nextLine()方法混用出现的问题及其解决方法

nextInt()和nextDouble()等系列方法和nextLine()一起使用会出现问题

class test05{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
            System.out.println("输入数字:");
           int key =  sc.nextInt();
            System.out.println("输入字符串");
            String str = sc.nextLine();//如果换成sc.next()则正常运行
    }
}
/*
输出结果:
输入数字:
1
输入字符串

Process finished with exit code 0
程序直接跳过字符串的输出,如果觉着不明显 可以写到死循环里自己感受一下
*/

为什么会出现这种问题呢?

nextLine():结束的标记为换行符 并且它可以获取前面的剩余下来的字符

再看看nextInt()方法的作用:遇到第一个有效字符(非空格,非换行符)是开始扫描,但是遇见第一个

分隔符或者结束符时(空格,enter,tab)结束扫描,获取扫描到的不含空格,换行的单个字符串,所以

它留下了一个换行符,然而呢这个换行符被nextLine()读取了,所以导致了字符串还没有输入就被

跳过了.解决办法在nextInt()方法下加一个nextLine()方法用来清空空白符.

修改后的代码如下

class test05{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

            System.out.println("输入数字:");
            int key =  sc.nextInt();
            sc.nextLine();
            System.out.println("输入字符串");
            String str = sc.nextLine();

    }
}

/*
输入数字:
9
输入字符串
l

Process finished with exit code 0

*/
//这样也可以结局问题,重新new一个扫描器
class test05{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
            System.out.println("输入数字:");
            int key =  sc.nextInt();
            sc = new Scanner(System.in);
            System.out.println("输入字符串");
            String str = sc.nextLine();
        

    }
}

或者使用next()也可以,看一下这俩个方法的具体区别

具体区别

next():该方法在读取内容时,会过滤掉有效字符前面的无效字符,对输入有效字符之前遇到的空格,Tab键或者Enter键等结束符,next()方法会自动将其过滤掉;

只有在读取到有效字符之后,该方法才会将其后的空格键,Tab键或Enter键等视为结束符,所以该方法不能得到带空格的字符串,该方法在扫描到空白符的时候会将前面的数据读取走,但也会丢下一个空白符"\r"在缓冲区中,所以也不能和nextLine()混用

nextLine():该方法字面上扫描一整行的意思,它的结束符只能时Enter键,即nextLine()方法返回的是Enter键之前没有被读取的所有字符,它是可以得到带空格的的字符串的

class test05{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(true){
            try {
                System.out.println("输入数字:");
                int key =  sc.nextInt();
            } catch (Exception e){
                System.out.println("请输入正确数字");
            }
        }
    }
}

以上代码执行的时候,当输入数字时,输入字符串,就会出现一直循环输出

请输入正确数字
输入数字:

其原因还是在sc.nextInt()这,nextInt()方法在发生异常后,不能在接受用户输入的任何数据,而是徘徊在异常区域,外部还实现了死循环就会到导致输出,解决办法跟上面一样

class test05{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(true){
            try {
                System.out.println("输入数字:");
                int key =  sc.nextInt();
            } catch (Exception e){
                System.out.println("请输入正确数字");
               // sc.nextLine();
                sc = new Scanner(System.in);
            }
        }
    }
}
//这俩种方案都可以解决问题

总结

nextInt()和next()方法读取数据都会留一个小尾巴(空白符"\r"),都会被nextLine()所读取,然后nextLine()无法获取字符串被直接跳过

你可能感兴趣的:(Scanner使用出现的问题及解决办法)