前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java笔记-异常之InputMismatchException的解决

Java笔记-异常之InputMismatchException的解决

作者头像
HCG_Sky
发布2022-03-31 21:24:44
1.7K0
发布2022-03-31 21:24:44
举报
文章被收录于专栏:HCG_Sky's BlogHCG_Sky's Blog

一顿操作猛如虎,一看运行InputMismatchException?

前言

InputMismatchException异常是输入不匹配异常,即输入的值数据类型与设置的值数据类型不能匹配 相信不少和我一样的初学者在使用Scanner获取数据时都遇到过这样一种情况 在创建了一个Scanner对象后,先是用该对象的nextInt()方法获取了一个int类型的数据,紧接着我们需要用着同一个对象利用其nextLine()方法获取一个String类型的数据 在实际运行时你就会发现,程序在获取完int类型的数据后就结束了 亦或者是在上面代码层面获取完String类型数据的基础上再去获取一个int类型的数据就会出现InputMismatchException异常 那时的我才疏学浅,一度认为是创建的Scanner对象只能获取同一种数据类型,因此就用了一中最笨的方法来解决,那就是再创建一个对象来进行数据获取 在多日的深入学习后,发现自己是多么的好笑哈哈哈,所以特此在这记录一下,其原因,其原理,其解决方案

以下附上代码及图示,方便大家理解这个问题

第一种情形

代码语言:javascript
复制
import java.util.Scanner;

//第一种情形
public class tset {
    public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);

       System.out.println("请输入一个数字:");
       int x = sc.nextInt();
       System.out.println("请输入字符串:");
       String str = sc.nextLine();

       System.out.println("=====分割线=====");
       System.out.println(x);
    }
}

第二种情形

代码语言:javascript
复制
import java.util.Scanner;

//第二种情况
public class tset {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入一个数字:");
        int x = sc.nextInt();
        System.out.println("请输入字符串:");
        String str = sc.nextLine();
        System.out.println("请再输入一个数字:");
        int y = sc.nextInt();

        System.out.println("=====分割线=====");
        System.out.println(x);
        System.out.println(str);
    }
}

nextInt()、nextLine()、next() 能做啥?

 要想解决问题,那就要先去了解问题,相信大家对前两个nextInt()nextLine()都不陌生,但你真的明白它是如何工作的吗?所以在我翻查JDK开发手册后总结出如下结论

nextInt()

 在你使用nextInt()的时候后边有一个换行符(也就是我们回车Enter这个操作)没有被变量接受,前边的int变量只是接受了你输入的数值,因此我们回车Enter这个操作其仍存在于缓冲区中

next()

 对输入有效字符之前遇到的空格键、Tab键或回车Enter键等结束符,next()方法会自动将其去掉,只有在输入有效字符之后,next()方法才将其后输入的空格键、Tab键或回车Enter键等视为分隔符或结束符。所以next()不能得到带空格的字符串。

nextLine()

nextLine()是只有遇到回车Enter时才结束(只认回车Enter为其输入结束符),所以可以得到带空格的字符串

分析问题

 通过上面的了解,我们可以知道,在使用nextInt()方法后,缓冲区中还存着一个未被接收的回车Enter,如若我们紧接着使用nextLine()方法,缓冲区的回车Enter就会被nextLine()方法识别为结束符,提交一个空的字符串数据,从而造成了程序开头我们看到的程序结束InputMismatchException异常

异常的解决

方法一: 我们可以在nextInt()后面加上一个nextLine()用于过滤其后面的Enter等结束符。 方法二: 我们可以不使用nextLine()方法,直接使用next()方法代替。

其修改代码如下,这里用会出现异常的那种情形为大家展示解决问题的方式

第一种方法

代码语言:javascript
复制
import java.util.Scanner;

//第二种情况
//解决方法一
public class tset {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入一个数字:");
        int x = sc.nextInt();
        sc.nextLine();    //多输入一个NextLine()把未接收的回车Enter接收掉
        System.out.println("请输入字符串:");
        String str = sc.nextLine();
        System.out.println("请再输入一个数字:");
        int y = sc.nextInt();

        System.out.println("=====分割线=====");
        System.out.println(x);
        System.out.println(str);
        System.out.println(y);
    }
}

第二种方法

代码语言:javascript
复制
import java.util.Scanner;

//第二种情况
//解决方法二
public class tset {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入一个数字:");
        int x = sc.nextInt();
        System.out.println("请输入字符串:");
        String str = sc.next();        //根据next()方法的特性
                                    //直接使用next()方法代替
                                    //但这将使得输入内容不能带有
                                    //诸如空格键、Tab键或Enter键
                                    //等会被视为分隔符或结束符
        System.out.println("请再输入一个数字:");
        int y = sc.nextInt();

        System.out.println("=====分割线=====");
        System.out.println(x);
        System.out.println(str);
        System.out.println(y);
    }
}

写在最后

 看了这么多~今天你学废了吗哈哈哈!

本篇文章采用 署名 4.0 国际 (CC BY 4.0) 许可协议进行许可。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-12-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • nextInt()、nextLine()、next() 能做啥?
      • 分析问题
        • 异常的解决
          • 写在最后
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档