Java异常解析输入不匹配异常在输入时输入

Java异常解析输入不匹配异常在输入时输入

Java 异常解析

前言

异常处理使得程序可以处理非预期的情景,并且继续正常的处理。

在程序运行过程中,如果 JVM 检测出一个不可能执行的操作,就会出现运行时错误(runtime error)。例如,如果使用一个越界的下标访问数组,程序就会产生一个ArraylndexOutOfBoundsException 的运行时错误。如果程序需要输入一个double 值,会得到一个 InputMismatchException 的运行时错误。

在 Java 中,运行时错误会作为异常抛出。异常就是一种对象,表示阻止正常进行程序执行的错误或者情况。如果异常没有被处理,那么程序将会非正常终止。该如何处理这个异常,以使程序可以继续运行或者优雅终止呢?本篇文章将介绍该主题。

一、异常概述

异常就是程序在运行过程中出现的一些错误,我们通过面向对象的思想c#异常处理机制 unity,把这些错误也用类来描述,那么一旦产生一个错误,即就是创建了某一个错误的对象,这个对象就是我们所说的异常对象。

在这之前也见过很多的异常错误,例如:

(1)IndexOutOfBoundsException:

(2)NullPointerException

空指针异常 对null调用其成员。

(3)ArithmeticException

数学运算异常 非法的数学运算。

(4)ClassCastException

类型转换异常 将类进行错误的强制转换。

(5)NumberFormatException

数字格式化异常 将数字字符串进行解析。

(6)InputMismatchException

输入不匹配异常 在输入时输入非法数据。

(7)ParseException

时间解析异常 非法的时间格式。

(8)StackOverFlowError

栈内存溢出异常 函数递归。

(9)OutOfMemoryError

堆内存异常 数组空间开辟过大 程序中对象太多。

为了演示异常处理,在这里举了个例子,进行讲解:

 public static void main(String[] args) {
    int[] arr = {1,2,3,4,5};
    int num = getNumber(arr,10);
    System.out.println(num);
}
private static int getNumber(int[] arr, int i) {
    return arr[i];
    //如果arr为null NullPointerException
    //如果i越界 ArrayIndexOutOfBoundsException
}

如上述代码所示,对于一个有返回值的函数而言,如果操作计算是正确的话,肯定会有一个正常的返回值程序开发,如果操作计算是错误的话,从函数的角度而言 会不会有正常的返回值呢?不会;

本质上,大部分的错误游戏素材下载 免费,其实都是由JVM发现并抛出的 当然我们也可以手动去判断。

private static int getNumber(int[] arr, int i) {
    //return arr[i];//是由JVM来进行判断的
    //模拟JVM的操作 用手动的判断模拟JVM自动的发现
    if (arr == null) {
        //产生一个空指针异常的问题对象
        //用throw(抛出)关键 将产生的问题告知调用者
        throw new NullPointerException();
        //一旦上述抛出一个问题 此函数立马中断
        //类似于return 正常结束(弹栈)
        //throw非正常结束(中断 强制弹栈 并抛出问题给调用者)
    }
    if (i < 0 || i >= arr.length) {
        //产生一个数组角标越界异常的问题对象
        throw new ArrayIndexOutOfBoundsException();
        //throw new StackOverflowError();
        //PS 一旦出现错误 抛出问题即可 但是最好抛出最相关最精确的问题
    }
    return arr[i];
}

getNumber函数如果发生了问题是直接将问题抛给主函数的,但是主函数也没有处理这个问题,主函数接着将问题抛给调用者JVM,JVM才不帮你解决 结果就是程序中断了!

JVM----->调用main----->调用getNumber----->getNumber出现异常----->抛出给main----->main没有处理----->抛出传递给JVM----->JVM直接中断。

PS:当然 函数内部如果出现问题,也可以将问题在内部处理 处理后 就不需要向上层抛出。

二、异常类型

既然错误的原因有很多,描述错误的类也有很多,那么这种情况就产生了一个大的家族/体系,这里面全都是异常错误类,我们叫做异常体系。

对于异常体系而言,大家都是错误,只不过所产生的原因不太一样,不断的进行向上抽取共性,最终抽出Throwable这个接口(可以被抛出的),但凡是异常对象,无论原因,都可以被抛出。

Throwable类是 Java 语言中所有错误或异常的超类,只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。

异常是对象,而对象都采用类来定义。异常的根类是 java.lang.Throwable。关系图如下:

注意:类名 Error、Exception 和 RuntimeException 有时候容易引起混淆。这三种类都是异常,这里讨论的错误都发生在运行时。

Throwable 类是所有异常类的根。所有的 Java 异常类都直接或者间接地继承自Throwable。可以通过继承 Exception 或者 Exception 的子类来创建自己的异常类。

这些异常类可以分为三种主要类型:系统错误、编译时异常和运行时异常。

1.系统错误(Error)

OutOfMemoryError :内存耗尽 ;

NoClassDefFoundError :无法加载某个Class ;

StackOverflowError :栈溢出。

2.编译时异常(Exception)

Exception 则是编译时异常,它可以被捕获并处理。

某些异常是应用程序逻辑处理的一部分,应该捕获并处理。例如:

还有一些异常是程序逻辑编写不对造成的,应该修复程序本身。例如:

3.运行时异常(RuntimeException)

RuntimeException、Error 以及它们的子类都称为免检异(unchecked exception )。所有其他异常(编译时异常)都称为必检异常(checked exception), 意思是指编译器会强制程序员检査并通过 try- catch 块处理它们,或者在方法头进行声明。

在大多数情况下,免检异常都会反映出程序设计上不可恢复的逻辑错误。例如,如果通过一个引用变量访问一个对象之前并未将一个对象陚值给它,就会抛出 NullPointerException异常;如果访问一个数组的越界元素c#异常处理机制 unity,就会抛出IndexOutOfBoundsException 异常。这些都是程序中必须纠正的逻辑错误。免检异常可能在程序的任何一个地方出现。为避免过多地使用 try-catch 块,Java 语言不强制要求编写代码捕获或声明免检异常。

Java规定:

文章来源:https://blog.csdn.net/m0_46316970/article/details/119898445