Scanner中的hasNext()和while()结合使用

本文探讨了在Java中Scanner的hasNext()方法与while循环结合使用时可能出现的问题。当Scanner与System.in配合时,程序可能因缺少close()方法导致无法结束循环。而在使用定长Scanner对象时,程序会在读取完整个输入后正常退出循环。总结了这种情况下如何避免程序陷入无限循环。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Scanner中的hasNext()方法用作while()的条件判断时,会导致程序不能跳出循环,下面通过两种情况进行说明。

结合System.in创建Scanner对象。

代码

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a = 0;
        while (scanner.hasNext()) {
            System.out.println("有下一个,下一个是:");
            a= scanner.nextInt();
            System.out.println(a);
        }
        System.out.println("到尾!没有下一个");
    }
}

截图
在这里插入图片描述
绿色的1 2 3 4是输入。仔细观察可以发现,程序最终没有结束,scanner还在等待用户的输入,这是因为hasNext()方法会一直寻找下一个标记(token,就是有效匹配项)直到Scanner对象被colse()方法关闭(显然,上面程序没有合适的关闭位置),否则hasNext()宁愿挂起程序等待用户输入也不跳出循环。

不使用System.in,创建定长Scanner对象

代码

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner("1 2 3 4");
        int a = 0;
        while (scanner.hasNext()) {
            System.out.println("有下一个,下一个是:");
            a= scanner.nextInt();
            System.out.println(a);
        }
        System.out.println("到尾!没有下一个");
    }
}

截图
在这里插入图片描述
可以看到此时scanner读取完最后一个整数4之后退出while()循环,结束程序。这是由于程序中的Scanner对象中的字符串是定长的(在初始化时就确定),执行到最后一个元素4后再次判断hasNext()==false,这样就跳出循环,紧接着结束程序。

通过以上两种情况可以知道在while(hasNext())组合时,使用System.in(也就是控制台输入)会导致程序无法跳出循环(没有使用close()关闭Scanner对象)。而其他定长的Scanner对象则不存在这个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值