hasNext和hasNextLine的区别及可能会造成问题的原因
二者都是用于判断“有无键盘输入”的,有则返回true,没有则阻塞!一定记住是阻塞而不是返回false,他会让你一直阻塞在判断阶段,二者只是在细节上有不同
hasNext()
方法会判断接下来是否有非空字符.如果有,则返回true,没有则阻塞。
例如一直敲回车相当于一直判断为空字符,但是不会返回false,而是一直阻塞在判断阶段,直到你输入了非空字符hasNextLine()
方法会根据行匹配模式去判断接下来是否有一行(包括空行),如果有,则返回true。这个没什么特别的,只要是你敲了回车那都是true并且不会阻塞
首先,在看用法和解释之前,有以下几个点必须时刻牢记
- next方法不能录入空格,在特定情况下会把空格当作回车,
nextLine
方法可以识录入空格hasNext
和hasNextLine
的返回值都是boolean
类型,但只有可能返回true,不可能返回false,并且都默认以回车键为结束(hasNext
可以设置为任意符号为结束键,不在本文研究范围之内)hasNext、next
不能直接识别裸回车,而hasNextLine
和nextLine
都可以直接识别裸回车。换句话讲:对于不输入符号而直接裸敲一个回车的操作,只有后两个能识别
hasNext
、hasNextLine
在返回一个boolean
类型结果true的同时,会在堆空间中开辟一块专门用于存放刚刚输入的字符串,用于下次next
或者nextLine
:即下次next
或者nextLine
不需要再从键盘输入,相当于系统自动把刚刚输入的字符串再原封不动的输入了一遍。同时这个存储寿命=调用对象的寿命- 对于
hasNext
来说,每次敲击回车都相当于在堆空间中开辟一行,敲几次回车就会直接给后续next
、nextLine
方法赋值几次hasNext
是线程阻塞的,对于hasNext
来说,如果一直不输入字符,反而一直敲回车的话,整个线程会卡在这个输入的地方,直到有字符输入
总结
hasNext、hasNextLine
不可能返回false,只有true和阻塞两种结果
hasNext、hasNextLine
会判断有无输入,并且hasNext
一直敲回车而不输入字符会导致线程阻塞。如果直接连续敲回车,那么hasNextLine
会判断为true。
hasNext、hasNextLine
也有存储功能,从“开始输入”到“判断结束”的过程中的所有输入都将储存,直到之后遇到需要键盘输入的next、nextLine
,这些存储的字符串和空格会自动填写给后面的next、nextLine
。而空格在next
和nextLine
上有不同的表现。
还有很多同类型的不同方法,可以点击以下链接参考原文。
来自参考原文链接:https://blog.csdn.net/m0_56079407/article/details/120576881