【发布时间】: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