hasNext()、next()、nextLine()

主要通过Scanner类说一下这几个函数。

 

一、hasNext()函数

先看一段代码:

package AllTests;

import java.util.Scanner;

class NextNextLineNextIntTest {

	public static void main(String[] args) {
		
		System.out.println("随便输入一些单词,逗号隔开:");
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()) {       	
            System.out.println("刚才输入内容为:"+ sc.next());
        }
        System.out.println("会执行到这里吗?");		
	}

}

结果:

很明显,最后的那句输出语句并没有执行到,这是为什么呢?看一下源码。

/**
     * Returns true if this scanner has another token in its input.
     * This method may block while waiting for input to scan.
     * The scanner does not advance past any input.
     *
     * @return true if and only if this scanner has another token
     * @throws IllegalStateException if this scanner is closed
     * @see java.util.Iterator
     */
    public boolean hasNext() {
        ensureOpen();
        saveState();
        while (!sourceClosed) {
            if (hasTokenInBuffer())
                return revertState(true);
            readInput();
        }
        boolean result = hasTokenInBuffer();
        return revertState(result);
    }

只要这个scanner的输入(缓冲区)中有其他token(输入的字符或数字),就会返回true。却根本没说什么时候返回false。实际上,只要有字符输入,hasNext()方法便会返回true,当你不输入时,扫描为空,这时并不返回false,而是进入waiting for input to scan的状态,此时方法阻塞,等待输入,然后继续扫描。所以并没有主动的出口走出while循环,也就自然不会执行到上面最后一句输出语句。

解决方法:

使用hasNext()带参数的重载方法,这个方法在扫描到参数内容是会返回true。所以自然也可以取反为false作为循环出口。

 

二、next()方法

next()一定在读取到有效字符之后才去寻找结束符,如果在遇到有效字符之前先遇到了空格键,Tab键或Enter键等结束符,next()方法会自动将其跳过,直到遇到输入有效字符后,next()方法开始寻找其后输入的空格键,Tab键或Enter键等,找到结束符后,读出第一个有效数字到结束符之前的内容(不包含结束符),结束符仍然会被留在缓冲区。。。所以next()方法不能得到带空格的字符串。

三、nextLine()方法

有这么一句话:nextLine()不要和其他next方法一起用!!尤其nextLine()不要放在它们后面!!!虽然并不是不允许一起使用,但是也可以看出来,如果连用的话,一不小心就会掉进坑里。为什么呢?

nextLine()方法只认Enter键为结束符,它是可以得到带空格的字符串的,所以空格也是他的有效字符之一。如果放在nextLine()之后用的话,容易因为思考不周而出问题。看个例子:

package test;

import java.util.Scanner;

class test3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc  = new Scanner(System.in);
		while(sc.hasNext()){
			System.out.println("数据1:"+sc.next());
			System.out.println("数据2:"+sc.nextLine());
		}
		System.out.println("会执行到这里吗?");
	}

}

运行结果如下:

第一次测试我们用空格隔开,输入a b c d e f后,next()从a开始生效,计算到a后空格结束,然后从a后的那个空格开始算,都是nextLine()的有效数,直到输入f后,按下ENTER键,nextLine()取值也结束。从输出可以清晰看到b前面的空格是被nextLine()读出来的。

第二次测试,我们输入a后,按下ENTER键结束,还并没有再次输入,就直接输出了两次的数据。这是因为输入a后,再输入ENTER键,next()取到a,结束。nextLine()刚一开始运行便遇到了结束符ENTER,所以nextLine()直接结束了。导致输出结果和我们想的不一样。这才说不要再next()后用nextLine()。其实其他的几个函数也一样,nextInt()、nextFloat()、nextLong()等等,只是指定了不同的接收数据类型。和next()作用原理大同小异。

如果想解决上面的问题也有办法,一般是在nextLine()之前先用一次nextLine()消耗掉那个ENTER结束符,就可以了。不过建议大家记住不要将nextLine()紧挨着next()、nextInt()等连用就OK啦。

 

以上!

 

 

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值