menu HCG_Sky's Blog
more_vert
chevron_right 首页 » 学习笔记,教程,随笔 » Java笔记-异常之InputMismatchException的解决
Java笔记-异常之InputMismatchException的解决
2021-12-01 | 学习笔记,教程,随笔 | 暂无评论 | 610 次阅读 | 983字

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

前言

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

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

第一种情形

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);
    }
}

第二种情形

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()方法代替。

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

第一种方法

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);
    }
}

第二种方法

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);
    }
}

写在最后

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


废话少说

快去提升吧哈哈
文章目录
发表评论
暂无评论
textsms
account_circle
email
link


七牛云 腾讯云 阿里云 百度统计 TrustAsia 安全签章 MySSL 安全签章