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

问题

对于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();返回下一个标记。重要的是要注意,扫描器返回一个空格和一个字母,因为它从最后一个标记的末尾读取,直到下一行的开头。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值