【问题标题】:Understanding Scanner's nextLine(), next(), and nextInt() methods了解 Scanner 的 nextLine()、next() 和 nextInt() 方法
【发布时间】:2015-09-26 15:29:05
【问题描述】:

我试图了解这三种方法的工作原理。以下是我对它们的理解:

  • 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”?

这是否意味着即使nextInt() 没有读取第一行的转义字符,方法next() 也会读取下一行?

【问题讨论】:

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

标签: java


【解决方案1】:

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 源代码中,在字符串和字符文字中。它们可能 >> 表示

【讨论】:

    【解决方案2】:

    如果您的输入是2 hello hi

    nextInt() - 只需将下一个标记读取为 int(这里 - 它是 2),否则会出错

    next() - 只需读取下一个标记,(这里 - 它是 hello

    nextline() - 它读取一行,直到它得到换行符(这里 - 在读取 nextInt 输入的上一个 2 hello 后,下一个;下一行读取 hi 只是因为之后它找到了一个换行符)

    如果输入是

    2 
    
    Hi 
    
    Hello 
    

    nextInt, next 与上面的讨论相同。

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

    【讨论】:

    • 这实际上是不准确的。如果输入是“2 hello hi”,则 nextInt() 将读取标记“2”,next() 将读取标记“hello”,但 nextLine() 将是“hi”,在 hi 前面有一个空格,因为 next() 将将光标放在消耗的令牌之后
    猜你喜欢
    • 2014-04-22
    • 2017-12-19
    • 2015-10-23
    • 1970-01-01
    • 2015-10-17
    • 2014-11-23
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    相关资源
    最近更新 更多