了解Scanner类的nextLine()、next()和nextInt()方法

11

我正在尝试理解这三种方法的工作原理。这是我理解它们的方式:

  • nextLine() 读取当前行的剩余部分,即使它是空的。
  • nextInt() 读取一个整数,但不读取转义序列 "\n"。
  • next() 读取当前行,但不读取 "\n"。

假设我有以下代码:

import java.util.Scanner;

public class Welcome2
{
    public static void main(String[] args)
    {
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Next enter two words:");

        int n; 
        String s1, s2; 

        n = keyboard.nextInt(); 
        s1 = keyboard.next(); 
        s2 =  keyboard.nextLine(); 
        System.out.println(" n is " + n + " s1 is " + s1 + " s2 is " + s2); 
    }
}

如果我的输入是:

2 

Hi 

Hello 

然后我在屏幕上得到以下输出:

n is 2 
s1 is hi 
s2 is  

为什么s1的值会是"HI"?

这是否意味着next()方法读取了下一行,即使第一行的转义字符尚未被nextInt()读取?


5
next() 不是读取当前行,而是读取下一个 token。你是如何输入 "2 Hello Hi" 的?如果你按了两次回车,在输入 "Hi" 之前程序就会结束... - Jon Skeet
我输入了第一个值,然后按下回车键,接着是第二个值,再按回车键,最后是第三个值。在我的输入之间,我只按了一次回车键。 - mcfred
1
你是从命令行运行这个程序吗?你确定你正在运行你发布的完全相同的代码吗?因为当我运行它并尝试你所说的确切序列时,它会打印“n is 2 s1 is Hello s2 is”,并且根本没有给我输入“Hi”的时间。请注意,你的示例输出也有三行,而你的示例代码不会给出这样的结果。我怀疑你没有发布你实际运行的代码。(如果你修改了代码,请花些时间对其进行格式化,就像我对你当前的代码所做的那样。未适当缩进的代码更难阅读。) - Jon Skeet
非常抱歉格式不好,我已经修复了建议的错误。第二个输入应该是hi。 - mcfred
1
正如Jon所提到的,next尝试读取标记,而不是行。你需要知道的是,在该标记之后,它不会消耗行分隔符,但它将能够消耗和跳过放置在其前面的任何行分隔符。例如,假设|是扫描仪的光标,并且它位于文本2|\r\nfoo\r\nbar中。如果调用next(),它将读取\r \n,最后找到foo。它还将读取下一个字符\r以检查此标记的结束位置,但它不会消耗它(导致nextLine消耗它并返回空字符串)。 - Pshemo
2个回答

5

nextLine()方法会读取当前行的剩余部分,即使它是空的。

正确。

nextInt()方法会读取一个整数,但不会读取转义序列“\n”。

正确1

next()方法会读取当前行,但不会读取“\n”。

不正确。实际上,next()方法会读取下一个完整的标记。这可能是当前行的其余部分,也可能不是。根据换行符的位置,它可能会或可能不会消耗换行符。精确的行为由javadoc描述,您可能需要仔细阅读以便能够充分理解细微差别。

因此,在您的示例中:

  1. nextInt()调用会消耗2字符,并将光标留在NL处。

  2. next()调用跳过NL,消耗Hi,并将光标留在第二个NL处。

  3. nextLine()调用会消耗第二行的其余部分;即NL


1 ...除了您的术语错误。当读取数据时,它不是转义序列,而是一个行尾序列,可能由CR、NL或CR NL组成,具体取决于平台。您谈论的转义序列在Java源代码中,在字符串和字符文字中。它们可以>>表示<


3

如果您的输入为2 hello hi

nextInt() - 仅将下一个标记读取为int类型(这里是2),否则会报错

next() - 仅读取下一个标记(这里是hello

nextline() - 它读取一行直到遇到换行符(这里在读取了之前的2 hello输入后,由于找到了换行符,所以只读取hi

如果输入为

2 

Hi 

Hello 

nextInt,next与上述讨论相同。

在nextline()中,它会在完成由next()读取的输入Hi后找到换行符。因此,nextline()停止读取输入以获取换行符。


这实际上是不准确的。如果输入是“2 hello hi”,那么nextInt()将读取标记“2”,next()将读取标记“hello”,但nextLine()将是“ hi”,前面有一个空格,因为next()将在使用的标记之后立即放置光标。 - csguy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接