使用Scanner类控制台输入时出现直接跳过输入过程问题

在之前学习java 的时候,有用到过这样一个类Scanner用于在控制台输入内信息,但是在输入的时候偶然出现过一个问题:

举个栗子:

Scanner input = new Scanner(System.in);
System.out.println("请输入姓名:");
String name = input.nextLine();
System.out.println("请输入学号:");
int snum = input.nextInt();
System.out.println("你的姓名和学号为:"+name+"-"+snum);

功能可以体现出来
在这里插入图片描述
当将学号和姓名的输入顺序调整一下! 神奇的事情就发生了!

Scanner input = new Scanner(System.in);
System.out.println("请输入学号:");
int snum = input.nextInt();
System.out.println("请输入姓名:");
String name = input.nextLine();
System.out.println("你的姓名和学号为:"+name+"-"+snum);

结果:
在这里插入图片描述
我们会发现,在输入学号之后,直接就跳过了输入姓名的过程,这就尴尬了,为什么会这样呢?

后面才发现,原来是Scanner 类对象中的 nextInt()nextLine() 方法内部读取原理不同导致的。

对于nextLine()方法,在该例子中,当input调用nextLine()方法时,读取的是字符串形式,输入的内容就相当于在一个管道中。
在未输入的时候,类似于阻塞状态,当输入内容之后,输入回车,然后nextLine()方法就开始读取内容,nextLine的读取方式是将enter回车符号(\r\n)和输入内容一同读取出来,在赋值的时候它再将enter回车符除去。大概的可以理解为如下图:

输入:
在这里插入图片描述
读完之后,管道里面是空的。
在这里插入图片描述

对于nextInt()方法,在该例子中,当input调用nextInt()方法时,读取的是int整型形式,输入的内容就相当于在一个管道中。
在未输入的时候,类似于阻塞状态,当输入内容之后,输入回车,然后nextInt()方法就开始读取内容,nextInt的读取方式是将enter回车符号(\r\n)之前的输入内容读取出来,Enter回车符留在里里面。类似的还有nextLong();nextDouble;等等。大概的可以理解为如下图:

输入:
在这里插入图片描述
读完之后,管道里面还存在Enter回车符。
在这里插入图片描述
看到这,便可以解释这个神奇的事情了。
当先输入学号时调用的是nextInt()方法,读取完后剩下一个Enter回车符,不巧的是接下来输入姓名的时候,调用的是nextLine()方法,这时刚好有一个Enter回车符,它便以为输入完了就直接将Enter前面的空串读取进去了,所以我们看着的效果就像是直接跳过了输入姓名过程。

解决这个问题的方法有3种:
1,在调用nextInt()方法之后,nextLine()方法之前,加上一个语句 input.nextLine(); 将nextInt()读取后剩下的Enter回车符先读取掉。

Scanner input = new Scanner(System.in);
System.out.println("请输入学号:");
int snum = input.nextInt();
input.nextLine();//将回车符读取出来
System.out.println("请输入姓名:");
String name = input.nextLine();
System.out.println("你的姓名和学号为:"+name+"-"+snum);

2,使用 next() 方法之前代替 nexLine() 方法。

Scanner input = new Scanner(System.in);
System.out.println("请输入学号:");
int snum = input.nextInt();
System.out.println("请输入姓名:");
String name = input.next();//使用next()方法之前代替nexLine()方法
System.out.println("你的姓名和学号为:"+name+"-"+snum);

3,都使用nextLine()方法,赋值的时候再进行类型转换。

Scanner input = new Scanner(System.in);
System.out.println("请输入学号:");
int snum = Integer.parseInt(input.nextLine());
System.out.println("请输入姓名:");
String name = input.nextLine();
System.out.println("你的姓名和学号为:"+name+"-"+snum);
  • 30
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值