为什么程序在读取下一行之前运行?

时间:2016-12-21 21:44:11

标签: java

public class Solution {

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

        Scanner scan = new Scanner(System.in);
        /* Declare second integer, double, and String variables. */
        /* Read and save an integer, double, and String to your variables.*/
        int sec = scan.nextInt(); 
        double db = scan.nextDouble(); 
        String newWord = scan.nextLine(); 

        /* Print the sum of both integer variables on a new line. */
        System.out.println(i + sec);
        /* Print the sum of the double variables on a new line. */
        System.out.println(d + db);
        /* Concatenate and print the String variables on a new line; 
            the 's' variable above should be printed first. */
        System.out.println(s + newWord);
        scan.close();
    }
}

如果String newWord = scan.nextLine();放在int sec = scan.nextInt();之前,它可以正常工作。

2 个答案:

答案 0 :(得分:2)

只需将String newWord = scan.nextLine();替换为  String newWord = scan.next();

这里:

    double db = scan.nextDouble(); 
    String newWord = scan.nextLine(); 

scan.nextDouble()没有阅读所有内容,只有双倍内容 因此,scan.nextLine()会将newWord变量分配给当前行的其余部分,即空String""

  

如果String newWord = scan.nextLine();放在int sec =之前   scan.nextInt();它工作得很好。

确实因为""是String的有效值。因此,newWord具有""值。

修改评论

尽量避免将nextInt()nextDouble()等与nextLine()方法混合使用。
您可以执行nextLine()来读取空字符串并再次执行另一个nextLine()来读取用户的输入。

或者您甚至只能使用nextLine()数字类型,并从String输入创建数值。以下是您的代码示例:

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

    Scanner scan = new Scanner(System.in);
    /* Declare second integer, double, and String variables. */
    /* Read and save an integer, double, and String to your variables.*/
    int sec = Integer.valueOf(scan.nextLine()); 
    double db = Double.valueOf(scan.nextLine()); 
    String newWord = scan.nextLine(); 

    /* Print the sum of both integer variables on a new line. */
    System.out.println(i + sec);
    /* Print the sum of the double variables on a new line. */
    System.out.println(d + db);
    /* Concatenate and print the String variables on a new line; 
        the 's' variable above should be printed first. */
    System.out.println(s + newWord);
    scan.close();
}

答案 1 :(得分:0)

要了解此错误,您需要了解扫描仪的工作原理,以下是简要说明。 nextByte(),nextShort(),nextInt(),nextLong(),nextFloat(),next- Double()和next()方法称为标记读取方法,因为它们读取由分隔符分隔的标记。默认情况下,分隔符是空格字符。 令牌读取方法首先跳过任何分隔符(空格 默认情况下为字符),然后读取以分隔符结尾的标记。然后,令牌自动转换为byte,short,int,long,float或double类型的值。 对于next()方法,不执行转换。 令牌读取方法不会在令牌之后读取分隔符。 如果在令牌读取方法之后调用nextLine()方法,则此方法将读取从此分隔符开始并以行分隔符结束的字符。读取行分隔符,但它不是nextLine()返回的字符串的一部分。