Java 了解扫描仪';s nextLine()、next()和nextInt()方法

Java 了解扫描仪';s nextLine()、next()和nextInt()方法,java,Java,我试图了解这三种方法是如何工作的。我是这样理解他们的: nextLine()读取当前行的剩余部分,即使该行为空 nextInt()读取整数,但不读取转义序列“\n” next()读取当前行,但不读取“\n” 假设我有以下代码: import java.util.Scanner; public class Welcome2 { public static void main(String[] args) { Scanner keyboard = new Sca

我试图了解这三种方法是如何工作的。我是这样理解他们的:

  • 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()
读取

如果您的输入是
2 hello hi

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

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

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

如果输入是

2 

Hi 

Hello 
nextInt,next与上述讨论相同

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

nextLine()读取当前行的其余部分,即使该行为空

nextInt()读取整数,但不读取转义序列“\n”

正确1

next()读取当前行,但不读取“\n”

不正确。事实上,该方法读取下一个完整标记。这可能是也可能不是当前行的其余部分。它可能消耗,也可能不消耗线的末端,这取决于线的末端在哪里。javadoc描述了精确的行为,您可能需要自己仔细阅读,以便完全理解其中的细微差别

因此,在您的示例中:

  • nextInt()调用使用
    2
    字符,并将位置保留在
    NL

  • next()调用跳过
    NL
    ,使用
    H
    i
    ,并将光标留在第二个NL

  • nextLine()调用将使用第2行的其余部分;i、 e.
    NL


  • 1。。。除了你的术语是错误的。当数据被读取时,它不是一个转义序列。这是一个行结束序列,可能由CR、NL或CR NL组成,具体取决于平台。您正在讨论的转义序列是Java源代码中的字符串和字符文本。它们可能>>表示这是否意味着即使nextInt()尚未读取第一行的转义字符,方法next()也会读取下一行

    否。

  • next()
    无法读取下一行,它只读取空格前的内容

  • 当执行
    keyboard.nextLine()
    时,它会消耗第一次输入时仍在缓冲区中的“行尾”

  • 当您输入一个数字,然后按enter键时,
    keyboard.nextInt()
    只使用该数字,而不使用“行尾”

  • 使用next()将只返回空格前面的内容。下一行() 返回当前行后自动向下移动扫描仪


    next()
    不读取当前行-它读取下一个标记。你是怎么进入“你好”的?如果你按回车键两次,程序就会在你输入“Hi”之前结束……我输入了第一个值,按回车键,然后第二个,按回车键,第三个。我只在输入之间按了一次enter键。您是从命令行运行此操作的吗?你确定你正在运行你发布的代码吗?因为当我运行它并尝试你所说的确切顺序时,它会打印“n是2 s1是Hello s2是”,根本没有给我时间输入“Hi”。请注意,您的示例输出也有三行,而您的示例代码不会给出这三行。我怀疑你没有发布你正在运行的实际代码。(如果您修改了代码,请花点时间格式化它,就像我对您当前代码所做的那样。阅读没有适当缩进的代码要困难得多。)我为错误的格式道歉。我已经修复了建议的错误。第二个输入应该是hi。正如Jon提到的
    next
    尝试读取令牌,而不是行。您需要知道的是,它不会使用该令牌之后的行分隔符,但它将能够使用并跳过放置在它之前的任何行分隔符。例如,假设
    |
    是扫描器光标,它被放置在文本
    2\r\nfoo\r\nbar
    中。如果调用
    next()
    它将读取
    \r
    \n
    ,最后它将找到
    foo
    。它还将读取下一个字符
    \r
    以检查此tokken的结束位置,但不会使用它(导致
    nextLine
    使用它并返回空字符串)。实际上
    next()
    可以使用换行符,因为换行符包含在默认的“空白”分隔符模式中。Javadoc说:“扫描器使用的默认空白分隔符由Character.isWhitespace识别。”事实上,在OP的示例中,它使用了一个换行符;i、 e.
    2
    字符后的字符。当然,它不会在返回的字符串中包含分隔符字符。。。但这是另一个问题。这实际上是不准确的。如果输入为“2 hello hi”,则nextInt()将读取标记“2”,next()将读取标记“hello”,但nextLine()将为“hi”,在hi前面加一个空格,因为next()将光标放在已使用的标记后面