大家好,又见面了,我是你们的朋友全栈君。
一、实例代码
import java.util.*;
public class ScannerKeyBoardTest
{
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("执行吗");
}
}
最后的“执行吗”会被执行到吗?来,看实验结果
文字模糊,手动说明(这里的输入光标在闪动,期待你的再次输入!)
二、执行过程
为什么会这样,和我们理解的不一样呀?我们理解的运行过程是
hasNext()在缓冲区中依次扫描单词,分别返回true,然后再执行打印输出。扫描到空时返回false,退出while循环,最后执行“执行吗”语句。一般人都会这么想,然而不能想当然。下面我们去查一下API
方法解释:如果此扫描器的输入(缓冲区)中有另一个token(输入的字符串),则返回true。what? 根本没有提到什么时候返回false。其实执行过程是这样的(重点:),当执行到hasNext()时,它会先扫描缓冲区中是否有字符,有则返回true,继续扫描。直到扫描为空,这时并不返回false,而是将方法阻塞,等待你输入内容然后继续扫描。这样的话,它岂不是吃了**口香糖根本停不下来。
三、解决方法
使用带有参数的重载方法,当扫描到的字符与参数值匹配时返回true
修改后代码
import java.util.*;
public class ScannerKeyBoardTest
{
public static void main(String[] args)
{
System.out.println("请输入若干单词,以空格作为分隔");
Scanner sc = new Scanner(System.in);
while(!sc.hasNext("#")) //匹配#返回true,然后取非运算。即以#为结束符号
{
System.out.println("键盘输入的内容是:"
+ sc.next());
}
System.out.println("会执行的");
}
}
运行结果:
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/162034.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...