Java中中next与nextLine详细解析
1. next()用法
- next()一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键、Tab键或Enter键等结束符next()方法会自动将其去掉,只有在输入有效字符之后,next()方法才将其后输入的空格键、Tab键或Enter键等视为分隔符或结束符。
- 简单地说,next()查找并返回来自此扫描器的下一个完整标记。完整标记的前后是与分隔模式匹配的输入信息,所以next()方法不能得到带空格的字符串。
2. nextLine()用法
- nextLine()方法的结束符只是Enter键,即nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。
3. 实例分析
- 先使用nextLine()方法,再使用next()方法。
package digit;
import java.util.Scanner;
public class TestNumber {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1,s2;
Scanner sc=new Scanner(System.in);
System.out.print("请输入第一个字符串:");
s1=sc.nextLine();
System.out.print("请输入第二个字符串:");
s2=sc.next();
System.out.println("输入的字符串是:"+s1+" "+s2);
}
}
程序运行结果:
可见,nextLine()方法可以输出空格,直至扫描到enter键才结束;而next()方法读到空格就停止了从键盘读值的操作,无法输出带空格的字符串。
- 先使用next()方法,再使用nextLine()方法。
package digit;
import java.util.Scanner;
public class TestNumber {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1,s2;
Scanner sc=new Scanner(System.in);
System.out.print("请输入第一个字符串:");
s1=sc.next();
System.out.print("请输入第二个字符串:");
s2=sc.nextLine();
System.out.println("输入的字符串是:"+s1+" "+s2);
System.out.println("s1是:"+s1);
System.out.println("s2是:"+s2);
}
}
程序运行结果:
观察运行结果,可以得到以下发现:
- next()方法遇到空格的确会停止从键盘读数据的操作;
- nextLine()方法会自动读到第一次输入完后用户敲的回车(Enter键),从而导致第二次输入无法进行;
- 虽然第二次并没有从键盘输入数据,但是第一次输入以后未被读入s1的字符串部分均被完整的写入了s2;
- s2读到的是 空格+shi ytt!,注意,前面有一个空格哦。
- 为了规避这种问题,可以在next()方法后多加一条语句,使用nextLine()回收第一次输入后的回车输入。即:
package digit;
import java.util.Scanner;
public class TestNumber {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1,s2;
Scanner sc=new Scanner(System.in);
System.out.print("请输入第一个字符串:");
s1=sc.next();
s2=sc.nextLine();
System.out.print("请输入第二个字符串:");
s2=sc.nextLine();
System.out.println("输入的字符串是:"+s1+" "+s2);
System.out.println("s1是:"+s1);
System.out.println("s2是:"+s2);
}
}
运行结果:
注意:
实际上, nextDouble() ,nextFloat() ,nextInt() 等与nextLine()连用时都存在这个问题,解决的办法是:在每一个 next()、nextDouble() 、 nextFloat()、nextInt() 等语句之后加一个nextLine()语句,将被next()去掉的Enter结束符过滤掉。