Java中nextInt()后,接nextLine() 会读到一个空行

 Java中nextInt()后,接nextLine() 会读到一个空行



import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int N = sc.nextInt();
            int M = sc.nextInt();

            int[] scores = new int[N + 1];
            scores[0]=0;
            for (int i = 1; i <= N; i++) {
                scores[i]=sc.nextInt();
            }

            for (int i = 0; i < M; i++) {
                String str = sc.nextLine()+"------------";
                System.out.println(str);
            }

        }

    }
}

 

5 7
1 2 3 4 5
Q 1 5
U 3 6
Q 3 4
Q 4 5
U 4 5
U 2 9
Q 1 5
------------
Q 1 5------------
U 3 6------------
Q 3 4------------
Q 4 5------------
U 4 5------------
U 2 9------------
Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Scanner.java:864)
    at java.util.Scanner.next(Scanner.java:1485)
    at java.util.Scanner.nextInt(Scanner.java:2117)
    at java.util.Scanner.nextInt(Scanner.java:2076)
    at one.Main.main(Main.java:41)

Process finished with exit code 1

原因:

这是因为在调用nextLine()函数前调用了Scanner的另一个函数nextInt()(或是nextDouble())。出现这种情况的原因是两个函数的处理机制不同,nextInt()函数在缓冲区中遇到“空格”、“回车符”等空白字符时会将空白字符前的数据读取走,但空白字符不会被处理掉,而nextLine()函数是在缓冲区中读取一行数据,这行数据以“回车符”为结束标志,nextLine()会把包括回车符在内的数据提走。所以nextInt()后的nextLine()函数并非读取不到数据,因为nextInt()将“回车符”留在了缓冲区,nextLine()读取时遇到的第一个字符便是“回车符”,所以直接结束了。

 

解决方法:

1.在要使用nextLine()前先调用一次nextLine(),这样留在缓冲区的“回车符”就会被处理掉,这时第二个nextLine()函数可以正常读取到数据。 

 

2.避免在nextLine()之前调用nextInt()等函数,可以统一使用nextLine()来读取数据,之后再进行类型转换。

 

 

解决方案的参考文献

https://blog.csdn.net/u014584274/article/details/75089058

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值