关于nextInt(),next()等和nextLine()的误区

Scanner:
在API中是这样子解释的:一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串。
Scanner是我们从键盘输入最常用的类。
Scanner分隔符模式将输入打破到令牌,默认情况下匹配空格。 然后可以使用各种next方法将得到的令牌转换成不同类型的值。

  1. nextInt()和nextLine()的区别:
    看接下来一段代码:
public class Test1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        System.out.println(str);
        int a = scanner.nextInt();
        System.out.println(a);

    }
}

运行结果:

hello java
hello java
666
666

Process finished with exit code 0

看起来很正常,没有什么要注意的,可是当我们将第4,5行放在第6,7行之后:

public class Test1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        System.out.println(a);
        String str = scanner.nextLine();
        System.out.println(str);

    }
}

运行结果:

666
666


Process finished with exit code 0

其实并不是没有输入,而是系统在读取了int a = scanner.nextInt()之后,控制台就结束了,他并没有给我们继续输入的机会。
不仅仅是nextInt(),scanner.next() ; scanner.nextDouble() ; scanner.nextFloat() 等只要放在 scanner.nextLine() 之前,在我们第一次输入结束之后,控制台就会结束,不会给我们第二次输入的机会。
但是 scanner.nextLine();这句代码并不是没有运行,通过各种资料了解到,nextInt()只会读取数值,依旧还有一个回车“/r”没有读取,光标是放在本行中。所以,scanner.nextLine()读取的是回车“/r”并结束了。

Scanner是一个扫描器,我们录取到键盘的数据,先存到缓存区等待读取,它判断读取结束的标示是 空白符;比如空格,回车,tab 等等。

nextInt() ,scanner.next() , scanner.nextDouble() , scanner.nextFloat()等一系列结束的标志是读取到空白符;
而 scanner.nextLine() 结束的标志是读取到回车“/r”。

上文的第二种情况就是scanner.nextLine()读取到第一行的空白符,输入结束了,所以系统没有给我们输入的机会。
也就是nextInt()读取到空白符前的数据时结束了,然后把回车“\r”留给了nextLine();所以上面nextLine()没有输出,不输出不代表没数据,是接到了空(回车“/r”)的数据。

解决办法:
要想在nextInt()后读取一行需要再加上: scanner.nextLine()将nextInt()留下的“\r”读取掉。如下

public class Test1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        System.out.println(a);
        scanner.nextLine();
        String str = scanner.nextLine();
        System.out.println(str);

    }
}

运行结果:

666
666
hello java
hello java

Process finished with exit code 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值