为什么要使用scan.nextLine();扫描字符串和整数

时间:2016-10-07 11:43:17

标签: java

嗨,我遇到了问题并解决了,但我不知道原因:

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {

public static void main(String[] args) {
    int i = 4;
    double d = 4.0;
    String s = "Hello ";

    Scanner scan = new Scanner(System.in);

    int a;
    String c;
    a= scan.nextInt();
    scan.nextLine();
    c = scan.nextLine();
    System.out.println(i + a);
    System.out.println(s + c);
    scan.close();
    }
}
input:
4
World! How are you!!

当我在scan.nextLine();之前删除行c = scan.nextLine();时,我收到错误消息。有谁能告诉我原因。

我用过:

String a;
String c;
a = scan.nextLine();
int b = Integer.parseInt(a);
c = scan.nextLine();
System.out.println(i + a);
System.out.println(s + c);

但得到答案为:

44
Hello World! How are you

3 个答案:

答案 0 :(得分:0)

输入4后,

scan.nextLine正在读取回车键。

没有它,c被设置为回车键,程序就完成了。

public static void main(String[] args){
    int i = 4;
    String s = "Hello ";

    Scanner scan = new Scanner(System.in);

    int a;
    String c;
    a = Integer.parseInt(scan.nextLine());
    c = scan.nextLine();
    System.out.println(i + a);
    System.out.println(s + c);
    scan.close();
}

输入“4”和Doug的输出是:

8
Hello Doug

答案 1 :(得分:0)

原始代码的问题

scan.nextLine();
a = Integer.parseInt(scan.nextLine());
c = scan.nextLine();
System.out.println(i + a);
System.out.println(s + c);

是第一行。你必须丢弃第一行输入。

考虑您的输入

  

4
  你好吗

第一行是您的第一行

scan.nextLine();

因此,第一行

  

4

被丢弃。

然后,下一行代码是

a = Integer.parseInt(scan.nextLine());

首先执行scan.nextLine()。这将读取您的第二行

  

你好吗

并尝试使用Integer.parseInt()将其转换为数字,但会因您的例外而失败。

在你的解决方案中

a= scan.nextInt();
scan.nextLine();
c = scan.nextLine();

第二行是必要的,因为scan.nextInt不会删除换行符。

再次考虑输入

  

4
  你好吗

第一行a = scan.nextInt();读取

  

4

且只有4,将输入保留为

  


  你好吗

如果您现在直接执行c = scan.nextLine();c将被分配空字符串,这仍然是第一行。 因此,第二行删除空行,并将输入保留为

  

你好吗

现在可以使用c = scan.nextLine();读取

以获取所需的字符串。

如果您有更多问题,请尝试通过调试器和手动模拟执行代码,甚至可能在纸上。这有助于您了解实际发生的情况。

答案 2 :(得分:-1)

如果删除行scan.nextLine();,则表示您在一行中输入两个数据(变量a和c)。编译器很难决定哪一个应该被解决。但是如果添加行scan.nextLine();,两个输入将被编译在不同的行中并且可以。