Java Scanner中一起使用next()和nextLine()方法会出现什么情况?

Java中,我们可以通过 Scanner 类来获取用户的输入。先来看看next()方法的使用:

package WorkStudy;  
  
import sun.rmi.runtime.Log;  
  
import java.util.Scanner;  
  
public class ScannerTest {  
  
    public static void main(String[] args) {  
  
        /*  
 Scanner类中next的用法 */ //System.out.println("程序顶端输入验证: ");  Scanner s = new Scanner(System.in);  
  //从键盘接收数据  
  
 //next方式接收字符串  System.out.println("next方式接收: ");  
  
  //判断是否还有输入  
  if (s.hasNext()){  
            String str = s.next();  
  System.out.println("next()的值为: " + str);  
  }


输入:123

返回: next()的值为: 123

如果我们输入 123 456 hello world呢?

返回:123

这时候我们知道,使用next()方法时,输入中如果有空格、tab键等,next()只会获取空格前的有效字符,同时也会trim掉输入内容前的空格。不信我们试试

输入:123 3456 5555

返回:123

下面看下nextLine()的用法,还是使用同样的代码,只是需要修改下s.netLine()

package WorkStudy;  
  
import sun.rmi.runtime.Log;  
  
import java.util.Scanner;  
  
public class ScannerTest {  
  
    public static void main(String[] args) {  
    
  System.out.println("为nextLine()准备的值: ");  
  String str2 = s.nextLine();  
  System.out.println("nextLine()的值为: " + str2);  
  
  s.close();  
  
  }  
  
}

这次我们没有hasNext方法来判断是否有输入,直接上值

输入: 123

返回: 123

输入: 123 456 hello world

返回: 123 456 hello world

说明nextLine()方法,只要有输入值,无论输入的是什么(只要不是回车键),都会显示出来

那该方法会不会trim掉输入字符前的空格呢?我们来试试

输入 123 456 trim hello

返回 123 456 trim hello

说明会显示

那么如果这两个方法用在一起会怎么样呢?

package WorkStudy;  
  
import sun.rmi.runtime.Log;  
  
import java.util.Scanner;  
  
public class ScannerTest {  
  
    public static void main(String[] args) {  
  
        /*  
 Scanner类中next的用法 */ //System.out.println("程序顶端输入验证: ");  Scanner s = new Scanner(System.in);  
  //从键盘接收数据  
  
 //next方式接收字符串  System.out.println("next方式接收: ");  
  
  //判断是否还有输入  
  if (s.hasNext()){  
            String str = s.next();  
  System.out.println("next()的值为: " + str);  
  }  
  
  
        /*  
 Scanner类中nextLine的方法 */  System.out.println("为nextLine()准备的值: ");  
  String str2 = s.nextLine();  
  System.out.println("nextLine()的值为: " + str2);  
  
  s.close();  
  
  }  
  
}  

输入: 123

返回: next方式接收: 123
next()的值为: 123
为nextLine()准备的值:
nextLine()的值为:

然后发现后面的nextLine()值不能输入了,但是如果我输入 123 456 hello world 会返回什么呢?

返回: 456 hello world

为什么会这样呢?

null

原来是把回车符留在了缓冲区,下一次读取会碰到读取空字符串的情况

如果要避免这种情况,怎么办呢?

就是增加一句

String str3 = s.nextLine();

说明下面的nextLine()要读取再一次输入的值了,那么整体的程序为:

package WorkStudy;  
  
import sun.rmi.runtime.Log;  
  
import java.util.Scanner;  
  
public class ScannerTest {  
  
    public static void main(String[] args) {  
  
        /*  
 Scanner类中next的用法 */ //System.out.println("程序顶端输入验证: ");  Scanner s = new Scanner(System.in);  
  //从键盘接收数据  
  
 //next方式接收字符串  System.out.println("next方式接收: ");  
  
  //判断是否还有输入  
  if (s.hasNext()){  
            String str = s.next();  
  System.out.println("next()的值为: " + str);  
  }  
  
  
        /*  
 Scanner类中nextLine的方法 */  System.out.println("为nextLine()准备的值: ");  
  String str3 = s.nextLine();  
  String str2 = s.nextLine();  
  System.out.println("nextLine()的值为: " + str2);  
  
  s.close();  
  
  }  
  
}  

返回为

next方式接收: 23 456 789
next()的值为: 123
为nextLine()准备的值: 123 456 789
nextLine()的值为: 123 456 789

不过我们也发现,之前输入123 456 789,增加了一句之后,第一次输入的值都会清除掉

java不简单呀,一个类中一个方法就有很多规则,很多都是在使用中才发现的。