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()
读取整数,但不读取转义序列“\n”李>nextInt()
读取当前行,但不读取“\n”李>next()
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描述了精确的行为,您可能需要自己仔细阅读,以便完全理解其中的细微差别
因此,在您的示例中:
2
字符,并将位置保留在NL
处NL
,使用H
和i
,并将光标留在第二个NLNL
1。。。除了你的术语是错误的。当数据被读取时,它不是一个转义序列。这是一个行结束序列,可能由CR、NL或CR NL组成,具体取决于平台。您正在讨论的转义序列是Java源代码中的字符串和字符文本。它们可能>>表示这是否意味着即使nextInt()尚未读取第一行的转义字符,方法next()也会读取下一行 否。
next()
无法读取下一行,它只读取空格前的内容keyboard.nextLine()
时,它会消耗第一次输入时仍在缓冲区中的“行尾”keyboard.nextInt()
只使用该数字,而不使用“行尾”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()将光标放在已使用的标记后面