你不知道的Scanner类,细思极恐

一次惨痛的经历,昨晚的腾讯笔试里对输入的处理没处理好,导致在一道题上死磕太久,看来是与腾讯无缘了,吃一堑,长一智吧。

Scanner类的基本操作

//创建一个Scanner类的实例
Scanner in = new Scanner(System.in);
//获取输入的整数
int number = in.nextInt();//在Scanner类里通过nextXXX 来获取对应的数据类型
//获取输入的双精度浮点数
double figure = in.nextDouble();
//获取输入的单精度浮点数
float temp = in.nextFloat();
//获取输入的长整型
long pt = in.nextLong();

//而Scanner类里的hasNextXXX返回的类型都是boolean类型的 判断是否有XXX类型的数据
string str = in.next();
boolean flags = in.hasnext();
//关闭输入流 良好的习惯 避免资源占用
in.close();

  在这里稍微解释一下,Scanner是一个扫描器,我们录取到键盘的数据,先存储到缓存区等待读取,它判断读取结束的标识是空白符,比如说空格、回车(\r)、制表符(tab)。
  我们可以写一个小程序做个试验,程序代码如下:

public static void main(String[] args) {
        //创建Scanner实例
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            System.out.println("请输入你要输入的值:");
            String str = sc.next();
            System.out.println(str);
        }
    }

  程序运行的结果如下:
1587974539911945.jpg
  可以看出程序在最开始的时候是让我们先输入数据的,也就是说执行到sc.hasNext()这里的时候我们就要输入数据,而Scanner扫描器正是如此读取数据的,首先让你输入数据,它就把输入的数据保存到缓冲区里,hasNext是判断缓冲区是否还有输入的数据,而输入的数据是存储到缓冲区里,然后再从缓冲区里取出来,如果上面的程序变成这样:

public static void main(String[] args) {
        //创建Scanner实例
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            System.out.println("请输入你要输入的值:");
        }
    }

  那么程序运行之后的结果就是一直输出我们的“请输入你要输入的值:”,为什么会这样呢?因为hasNext方法在最开始的时候就要扫描缓冲区,如果缓冲区有我们期待的输入的数据的话就返回true,如果没有,不会返回false而是阻塞方法,等待你输入内容之后再继续扫描。而在上面的程序里,由于我们开始输入了数据,但是这个数据放在缓冲区里没有被拿出来,导致每一次扫描的时候,hasNext的返回值都是true,这就造成了无限循环。但是我们的第一个程序在循环里拿出每一次输入的数据,所以每次输入之后,按照要求输出了,之后还是要你输入数据。

Scanner类里值得注意的地方

  首先我们先来看一段程序:

public static void main(String[] args) {
        //创建Scanner实例
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        String line = sc.nextLine();
        System.out.println(a);
        System.out.println(line);
    }

  当我运行之后输入第一个数据之后回车,然后程序就结束了,运行结果如下:
1587976554070292.jpg
  然后经过查阅相关资料之后才发现,nextInt()方法读取的只是数字,当碰到空白符(制表符、空格、回车)就读取空白符之前的,而在我刚才的输入那里,我首先输入了22然后回车,这样nextInt方法只读取了我输入的22,但是22之后的回车没有读取到,而之后nextLine方法读取到了刚才遗留的回车,nextLine方法结束的条件是碰到回车,所以nextLine方法能够获取空格,所以此时读取到了刚才遗留的回车,也就自然结束了nextLine方法。
  所以,如果想要在使用了nextInt后使用nextLine,那么必须在中间插入一个nextLine来将之前遗留的回车给读取到,这样才能够正常读取(前提是你输入了int数据之后回车再输入数据)。所以我们的程序改为:

public static void main(String[] args) {
        //创建Scanner实例
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        sc.nextLine();
        String line = sc.nextLine();
        System.out.println(a);
        System.out.println(line);
    }

  运行结果为:
1587977348859152.jpg
  目前就先写这么多,以后要是有补充的再继续加上去。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值