问题

对于scanner对象,hasNextLine()方法如何返回true,而hasNext()方法如何返回false?

注:根据输入文件,hasNext()方法按预期返回结果;hasNextLine()方法似乎没有返回正确的结果。代码

下面是我运行的代码,它创建了以下结果:

public void ScannerTest(Reader fileReaderObject){

Scanner scannerObj = new Scanner(fileReaderObject);

for(int i = 1; scannerObj.hasNext(); i++){

System.out.println(i +":" + scannerObj.next());

System.out.println("Has next line:" + scannerObj.hasNextLine());

System.out.println("Has next:" + scannerObj.hasNext());

}

System.out.println();

scannerObj.close();

}

输入文件

以下是我要传递给此扫描仪的文件的实际内容:

a   3   9

b   3   6

c   3   3

d   2   8

e   2   5

f   2   2

g   1   7

h   1   4

i   1   1

结果

以下是运行代码时控制台中打印内容的结尾,包括我无法理解的部分:

25: i

Has next line: true

Has next: true

26: 1

Has next line: true

Has next: true

27: 1

Has next line: true

Has next: false

您的输入文件末尾是否有空行?

如果有下一行,甚至是空的,hasNextLine()返回true。如果还有一个令牌,hasNext()返回true。空行是不包含任何标记的行。

我认为next不消耗,所以"光标"就在新行之前,所以有下一行,但是没有更多的标记。

感谢您的回复。文件不包括"i 1 1"后面的空行,因此我希望一旦它在最后一行移动第二个"1",就没有其他行或返回字符可供它拾取。不过,有趣的是,如果在循环之后使用nextline()方法,则不会得到错误。所以可能有一个返回字符挂在那里?对于如何获取hasNextLine()方法和hasNext()方法的结果进行对齐有什么想法吗?

在文件末尾有一个额外的换行符。

hasNextLine()检查缓冲区中是否还有另一个linePattern。

hasNext()检查缓冲区中是否有可解析的标记,由扫描程序的分隔符分隔。

由于扫描器的分隔符是空白,而linePattern也是空白,所以缓冲区中可能有linePattern但没有可解析的标记。

通常,处理这个问题的最常见方法是在分析文本每一行中的所有令牌(如数字)之后始终调用nextLine()。当使用Scanner从System.in读取用户的输入时,您需要这样做。要使扫描仪超过此空白分隔符,必须使用scanner.nextLine()清除行分隔符。请参见:使用scanner.nextline()。

附录:

linePattern定义为与此匹配的Pattern:

private static final String LINE_SEPARATOR_PATTERN =

"

|[

\u2028\u2029\u0085]";

private static final String LINE_PATTERN =".*("+LINE_SEPARATOR_PATTERN+")|.+$";

默认的令牌分隔符是Pattern:

private static Pattern WHITESPACE_PATTERN = Pattern.compile(

"\\p{javaWhitespace}+");

首先,感谢您的详细回复。因此,我理解可能存在一个没有其他令牌的行分隔符模式。但是,在文件中,我无法将光标移过最后的"1"。是否有一些空白字符我不能通过gedit删除?

"You have a single extra newline at the end of your file."—我认为它比这更一般,如中所述—文件末尾有任何数量的空白(或您指定的分隔符)。

@杜克林是的,但是OP在某个地方说他检查了他的文件,没有额外的空白。

原因是hasNext()检查是否有更多的非空白字符可用。hasNextLine()检查是否有另一行文本可用。您的文本文件结尾可能有一个换行符,所以它有另一行,但没有其他非空白字符。

许多文本编辑器会自动在文件末尾添加新行(如果没有新行的话)。

换句话说,您的输入文件不是这样的(数字是行号):

1. a   3   9

2. b   3   6

3. c   3   3

4. d   2   8

5. e   2   5

实际上是这样的:

1. a   3   9

2. b   3   6

3. c   3   3

4. d   2   8

5. e   2   5

6.

简短回答

文件末尾有一个空行。空行原因

如果你把你的内容保存到一个txt文件中,一些编辑器会给你的文件添加一个空的新行。

编辑器的行为是这样的,因为这是POSIX标准的一部分:

3.206 Line

A sequence of zero or more non- characters plus a terminating character.

这个主题已经在这个线程中讨论过了。Java扫描器文档

下面是Java 8扫描器类的文档。

hasNext()

Returns true if this scanner has another token in its input.

hasNextLine()

Returns true if there is another line in the input of this scanner.

Java代码行为的原因

由于上述事实,hasNextLine()将返回true,但hasNext()找不到任何可以确认为Token的东西,因此返回false。

有关更多信息,请参阅Durron597 Post。

你消费的是EDOCX1的价值(0),但是你要的是hasNext()和hasNextLine()。默认情况下,next()将所有内容返回到下一个whitespace()。所以,您将遍历所有空格分隔的字符串,在每个字符串之后,您将询问关于nextLine()的问题。

i 1 1->hasNextLine()?真的。EDOCX1?1?也是如此。

1 1->hasNextLine()?真的。EDOCX1?1?也为真(仍为空白)

1->hasNextLine()?对(可能是行分隔符)。哈克斯顿?错误,不再有空白。

hasnext()和hasnextline()的基本概念是

HasnExtLe:如果此扫描仪的输入中有另一行,则返回"真"。此方法在等待输入时可能会阻塞。扫描器不会超过任何输入。

返回:如果且仅当此扫描仪有另一行输入时为真投掷:IllegalstateException-如果此扫描仪已关闭

哈萨特

如果下一个完整标记与指定模式匹配,则返回true。

完整的标记由匹配分隔符模式的输入进行前缀和后缀固定。此方法在等待输入时可能会阻塞。扫描器不会超过任何输入。

参数:模式-要扫描的模式

返回:如果且仅当此扫描程序具有另一个与指定模式匹配的令牌时为true

因为上次输入的nextline()为true,因为调用scan.nextline();返回下一个标记。重要的是要注意,扫描器返回一个空格和一个字母,因为它从最后一个标记的末尾读取,直到下一行的开头。

hasnext() java_关于Java:为什么HasNeXT()false,但hasNextLine() 是真的?相关推荐

  1. java scanner的hasnext,Java Scanner hasNext()方法

    Java Scanner hasNext()方法 java.util.Scanner.hasNext() 方法如果此scanner有另一个标记在它的输入,则返回true.在等待要scanner的输入, ...

  2. java hasnext_java – hasNext() – 什么时候阻止,为什么?

    我正在尝试通过扫描仪对象读取命令.为了检查输入语法,我使用sc.hasNext()(对于缺少命令的情况).它已经很好地适用于许多情况,但现在我已经在 JavaAPI中描述为"可以阻塞并等待输 ...

  3. java开发工具(3)你真的会用IDEA么?(下)keyMap、Project Structure功能介绍

    上一篇文章<java开发工具(2)你真的会用IDEA么?(中)>,我介绍了Idea的Spring,debug和TODO功能,相信通过上一节的学习,你的开发效率又提升了一截. 这次我会为你介 ...

  4. java中hasnext的作用_java中Scanner的hasNext()的疑问

    第一个问题,两段代码的区别在于阻塞的位置不同,加上一行输出代码就可以很明显地看到差别. Test.java import java.util.Scanner; public class Test { ...

  5. java hasnext_java hasNext()使用实例解析

    这篇文章主要介绍了java hasNext()使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 编写一段程序实现如果输入的一组数中含非整数 ...

  6. Java中hasNext()的作用

    Scanner s1 = new Scanner(System.in);while(s1.hasNext()){String str = s1.next();System.out.println(&q ...

  7. JAVA 关于hasNext的白话理解

    hasNext 读到空格自动退出不读了a b c三个值,中间是有空格的,当遇到空格,next()就停止了只能最先读取 a. 然后hasNext()就体现出他的用途了,判断是否还有需要输入的值. 不用说 ...

  8. cascade在java_【Java基础】集合

    一.Collection接口(超级接口:Iterator) 其下有两个子接口,Set和List. 1)Set接口的两个常用子类 TreeSet:有序存放 HashSet:散列存放 2)List接口(允 ...

  9. binaryviewer java_用java实现java的2进制文件字节序转换到C/C++的2进制文件字节序

    展开全部 package admit.action;/*用JAVA读取各种计算机文件系统的文件列表 当你安装了jdk,在32313133353236313431303231363533e78988e6 ...

最新文章

  1. usaco Dual Palindromes
  2. 查询最近一千条数据mysql_保留mysql数据库中的最新1000条记录
  3. leetcode897
  4. 若依集成CIM(即时推送系统)实现将服务端修改为SpringBoot+Vue前后端分离版(文末见代码下载)
  5. [学习笔记] Cordova+AmazeUI+React 做个通讯录 - 单页应用 (With Router)
  6. 程序员大佬的简历和普通程序员有啥区别?
  7. 为什么大部分男生比女生高?原因让你意想不到
  8. 解决Object() takes on paramenters的问题
  9. 141178万人, pyechart制作第七次人口普查数据动态图
  10. iTunes C# Mobile Device API代码-立哥开发
  11. 语音信号处理 —— 笔记(一)音频信号处理
  12. hive percentile_approx原理
  13. LiveMedia视频平台是如何实现基于网页的语音对讲
  14. 如何切换计费模式中的“按需”和“包年包月”?
  15. Unity入门——角色属性设置
  16. 怎么看jupyter的文件保存路径
  17. 安装pytorch一直报错解决方法!!! ERROR: Exception: Traceback (most recent call last): File “D:\Anacoda\lib\s....
  18. 荣耀路由器w831刷linux,华为荣耀WS831路由器设置的方法
  19. 在云服务器搭建vulhub靶场
  20. linux源码网址,可以在这里找到很多开源的驱动

热门文章

  1. 查看或修改mysql数据库及表编码格式
  2. 断言(Assertion)
  3. 为何电脑下载mp3等音乐导入U盘后无法在汽车上播放?网易云等音乐软件夹带私货!!
  4. STM32开发笔记112:ADS1258驱动设计——读寄存器
  5. 计算机网络--七层协议/五层协议
  6. mybatisSql编写小结
  7. 联想台式机计算机接口,如果不能使用Lenovo台式计算机的USB接口怎么办
  8. R语言使用fisher.test函数进行精确概率检验、检验两个分类变量是否独立(自定义构建列联表仿真数据)
  9. IAMP方式下载邮件记录
  10. GUI(图形用户界面)——AWT概述、布局管理器