Java使用判断输入hasNextLine/hasNext等时造成阻塞的原因

hasNext和hasNextLine的区别及可能会造成问题的原因

二者都是用于判断“有无键盘输入”的,有则返回true,没有则阻塞!一定记住是阻塞而不是返回false,他会让你一直阻塞在判断阶段,二者只是在细节上有不同

  • hasNext()方法会判断接下来是否有非空字符.如果有,则返回true,没有则阻塞。
    例如一直敲回车相当于一直判断为空字符,但是不会返回false,而是一直阻塞在判断阶段,直到你输入了非空字符
  • hasNextLine() 方法会根据行匹配模式去判断接下来是否有一行(包括空行),如果有,则返回true。这个没什么特别的,只要是你敲了回车那都是true并且不会阻塞

首先,在看用法和解释之前,有以下几个点必须时刻牢记

  • next方法不能录入空格,在特定情况下会把空格当作回车,nextLine方法可以识录入空格
  • hasNexthasNextLine的返回值都是boolean类型,但只有可能返回true,不可能返回false,并且都默认以回车键为结束(hasNext可以设置为任意符号为结束键,不在本文研究范围之内)
  • hasNext、next不能直接识别裸回车,而hasNextLinenextLine都可以直接识别裸回车。换句话讲:对于不输入符号而直接裸敲一个回车的操作,只有后两个能识别
    hasNexthasNextLine在返回一个boolean类型结果true的同时,会在堆空间中开辟一块专门用于存放刚刚输入的字符串,用于下次next或者nextLine:即下次next或者nextLine不需要再从键盘输入,相当于系统自动把刚刚输入的字符串再原封不动的输入了一遍。同时这个存储寿命=调用对象的寿命
  • 对于hasNext来说,每次敲击回车都相当于在堆空间中开辟一行,敲几次回车就会直接给后续nextnextLine方法赋值几次
  • hasNext是线程阻塞的,对于hasNext来说,如果一直不输入字符,反而一直敲回车的话,整个线程会卡在这个输入的地方,直到有字符输入

总结

hasNext、hasNextLine不可能返回false,只有true和阻塞两种结果

hasNext、hasNextLine会判断有无输入,并且hasNext一直敲回车而不输入字符会导致线程阻塞。如果直接连续敲回车,那么hasNextLine会判断为true。

hasNext、hasNextLine也有存储功能,从“开始输入”到“判断结束”的过程中的所有输入都将储存,直到之后遇到需要键盘输入的next、nextLine,这些存储的字符串和空格会自动填写给后面的next、nextLine。而空格在nextnextLine上有不同的表现。

还有很多同类型的不同方法,可以点击以下链接参考原文。
来自参考原文链接:https://blog.csdn.net/m0_56079407/article/details/120576881

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值