目录
写在前面:
很多刚学java的小伙伴都会遇到这个问题:在使用 nextInt() 方法之后立即使用 nextLine() 方法时,程序不等待用户输入,自动结束。下面来教大家解决一下~
一、基础知识
要解决这个问题,得对这两个方法有一定了解。
1. 介绍nextInt():
nextInt() 方法用于读取输入流中的下一个整数。它会扫描输入中的下一个标记,并将其解释为一个整数。如果输入中的下一个标记无法解释为整数,则 nextInt() 方法会抛出 InputMismatchException 异常。
2. 介绍nextLine():
nextLine() 方法用于读取输入流中的下一行文本。它会扫描输入中的下一行,并将其返回为一个字符串。nextLine() 方法会读取输入流中的换行符,并将返回一个空字符串。在输入中有空行时,nextLine() 也会读取该空行并返回一个空字符串。
3.额外补充next():
next() 方法用于读取输入流中的下一个单词(以空格为分隔符)。它会扫描输入中的下一个标记,并将其返回为一个字符串。next() 方法会忽略输入中的前导空白(空格、制表符等),并且只读取到下一个空白符之前的内容。因此,next() 方法通常用于读取单个单词或标记。
二、问题描述:
1.场景重现:
Scanner scanner =new Scanner(System.in);
System.out.println("请输入新学生id:");
int id=scanner.nextInt();
System.out.println("请输入新学生姓名:");
String name=scanner.nextLine();
还没等输入学生姓名,程序就自动结束了。
通过调试,可以看到,name实际读入了一个空字符串。
2.原因:
在使用 nextInt() 方法之后立即使用 nextLine() 方法时,由于 nextInt() 方法会读取一个整数,但会在输入缓冲区中保留换行符,然后 nextLine() 方法会读取这个换行符,而不会等待用户输入。这会导致 nextLine() 方法直接读取到换行符,从而导致输入不正确。
三、解决方法
1.调换两个方法的顺序:先执行 nextLine() 再执行 nextInt()。
Scanner scanner =new Scanner(System.in);
System.out.println("请输入新学生姓名:");
String name=scanner.nextLine();
System.out.println("请输入新学生id:");
int id=scanner.nextInt();
2.在调用 nextInt() 之后调用 scanner.nextLine() 方法来清空输入缓冲区,然后再读取字符串。修改后的代码如下所示:
Scanner scanner =new Scanner(System.in);
System.out.println("请输入新学生id:");
int id=scanner.nextInt();
scanner.nextLine();//吸收掉输入缓存区里的回车,确保 nextLine() 方法读取到正确的用户输入。
System.out.println("请输入新学生姓名:");
String name=scanner.nextLine();
3.使用 nextLine() 读取所有输入,然后将其转换为所需的类型。这种方法避免了缓冲区问题,因为所有输入都是以字符串形式读取的。
Scanner scanner =new Scanner(System.in);
System.out.println("请输入新学生id:");
int id=Integer.parseInt(scanner.nextLine());//将其转换为所需的类型
System.out.println("请输入新学生姓名:");
String name=scanner.nextLine();
System.out.println(id+name);