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

时间:2015-09-26 15:29:06

标签: java

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

  • 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()尚未读取第一行的转义字符?

3 个答案:

答案 0 :(得分:5)

  

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

正确。

  

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

正确 1

  

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

不正确。实际上,next()方法会读取下一个完整令牌。这可能是也可能不是当前行的其余部分。它可能会或可能不会消耗终点,具体取决于行尾的位置。 javadoc描述了精确的行为,你可能需要仔细阅读它,以便你能完全理解细微差别。

所以,在你的例子中:

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

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

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

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

答案 1 :(得分:2)

如果您输入的是2 hello hi

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

next() - 只需阅读下一个标记,(此处为hello

nextline() - 它读取一行直到它获得换行符(此处 - 读取nextInt输入的上一个2 hello后,next; nextline读取hi只是因为之后它找到换行符)

如果输入

2 

Hi 

Hello 

nextInt,下面的讨论也是如此。

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

答案 2 :(得分:-1)

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

  1. next()无法读取下一行,它只会在空格之前读取内容。

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

  3. 输入数字然后按Enter键,keyboard.nextInt()仅消耗数字,而不是“行尾”。

  4.   

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