Java中使用nextLine输入数据时遇到InputMismatchException异常的解决办法

Java中使用nextLine输入数据时遇到InputMismatchException异常的解决办法

异常产生的背景

今天在写一个很简单的编程练习“计算飞机票的实际价格”时,使用nextLine输入数据时遇到了InputMismatchException异常。

InputMismatchException异常

InputMismatchException异常:是输入不匹配异常,即输入的值数据类型与设置的值数据类型不能匹配。

我遇到的问题

package com.hhxy.practice;

import java.util.Scanner;

public class Test{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请您输入机票的原价");
        double price =  sc.nextDouble();

        System.out.println("请输入机舱类型:头等舱 or 经济舱");
        String type = sc.nextLine();//报InputMismatchException异常

        System.out.println("请输入月份信息:1~12月");
        int month = sc.nextInt();
    }
}

在这里插入图片描述

异常出现的原因sc.next()/sc.Double()/sc.nextInt()/等方法都是接收到各自的有效字符后遇到空格或者回车才结束输入,此时空格或回车,以及空格或回车后面的数据仍存在缓冲区中,后续的sc.方法会优先接收留在缓冲区中的数据。而sc.nextLine()方法是遇到回车就结束输入。明白这两类方法的区别,问题就迎刃而解了​😆
分析:当我输入100后,我按了回车想接着输入机舱类型,但此时机舱类型的输入使用的是sc.nextLine()方法,就在我在第一次输入100的时候,最后那个回车进入了缓冲区,直接被sc.nextLine()遇到并吸收了,sc.nextLine()方法直接就终止了输入,type直接为null,此时我的第二次输入内容就并不是被type接收,而是被month接收,month是int类型,当然就直接报InputMismatchException异常啦,恍然大悟🐒
异常解决的方法

  1. 方法1:在type类型的前面再写一个sc.nextLine()用来吸收存在缓冲区中的回车
  2. 方法2:将sc.nextLine()换成sc.next()(这个很好理解,因为sc.next会过滤掉有效字符前的非有效字符,只有接收到有效字符后遇到非有效字符才结束输入)

推荐阅读:sc.next()和sc.nextLine()的区别和注意事项

  • 测试
package com.hhxy.practice;

import java.util.Scanner;

public class Test1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        String st1 = sc.nextLine();//直接将回车给吸收了
        String st2 = sc.nextLine();
        System.out.println("a="+a);
        System.out.println("st1="+st1);  
        System.out.println("st2="+st2);
    }
}

在这里插入图片描述

sc.nextLine()在遇到sc.nextInt()输入时留在缓冲区中的回车直接结束输入,导致str1=null

在这里插入图片描述

sc.nextInt()会自动过滤掉有效字符前的非有效字符

总结

  • sc.nextLine()方法接收参数,从输入开始接收,遇到回车结束接收,同时吸收回车
  • sc.next()\sc.nextInt()\sc.nextDouble()等方法,从输入有效字符开始接收,遇到回车、空格结束接收,同时不会吸收回车、空格,回车、空格会留在缓冲区
  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知识汲取者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值