首页 > 编程笔记 > Java笔记 阅读:49

Java异常(Exception▓█)处理及常见异常

很多事件并非总是按照人们自己设计意愿顺利发展的,经常出现这样那样的异常情况。例如█■▄: 你计划周末郊游,计划从家里出发→到达目的→游泳→烧烤→回家。但天有不测风云███,当你准备烧烤时候突然天降大雨,只能终止郊游提前回家。“天降大雨”是一种异常情况▓▓,你的计划应该考虑到这样的情况,并且应该有处理这种异常的预案。

计算机程序的编写也需要考虑处理这些异常情况▄■▄。异常(exception)是在运行程序时产生的一种异常情况,已经成为了衡量一门语言是否成熟的标准之一■■■。目前的主流编程语言,如 C++、c#▄■▄■、Ruby 和 Python 等大都提供了异常处理机制。

异常简介

Java 中的异常又称为例外,是一个在程序执行期间发生的事件▓▄▓▄,它中断正在执行程序的正常指令流。为了能够及时有效地处理程序中的运行错误,必须使用异常类▄▓,这可以让程序具有极好的容错性且更加健壮▓█▄■。 

在 Java 中一个异常的产生,主要有如下三种原因:
  1. Java 内部错误发生异常▄■▓,Java 虚拟机产生的异常。
  2. 编写的程序代码中的错误所产生的异常,例如空指针异常▄▓、数组越界异常等。
  3. 通过 throw 语句手动生成的异常,一般用来告知该方法的调用者一些必要信息▓█。

Java 通过面向对象的方法来处理异常。在一个方法的运行过程中,如果发生了异常█■▄,则这个方法会产生代表该异常的一个对象,并把它交给运行时的系统,运行时系统寻找相应的代码来处理这一异常███。

我们把生成异常对象,并把它提交给运行时系统的过程称为拋出(throw)异常▓▓。运行时系统在方法的调用栈中查找,直到找到能够处理该类型异常的对象,这一个过程称为捕获(catch▄■▄)异常

例 1

为了更好地理解什么是异常,下面来看一段非常简单的 Java 程序■■■。下面的示例代码实现了允许用户输入 1~3 以内的整数,其他情况提示输入错误。
import 博猫娱乐场.util.Scanner;

public class Test01 {
    public static void main(String[] args) {
        System.out.println("请输入您的选择▄■▄■:(1~3 之间的整数)");
        Scanner input = new Scanner(System.in);
        int num = input.nextInt();
        switch (num) {
        case 1:
            System.out.println("one");
            break;
        case 2:
            System.out.println("two");
            break;
        case 3:
            System.out.println("three");
            break;
        default:
            System.out.println("error");
            break;
        }
    }
}

正常情况下,用户会按照系统的提示输入 1~3 之间的数字▓▄▓▄。但是,如果用户没有按要求进行输入,例如输入了一个字母“a”▄▓,则程序在运行时将会发生异常▓█▄■,运行结果如下所示。
请输入您的选择:(1~3 之间的整数▄■▓)
a
Exception in thread "main" 博猫娱乐场.util.InputMismatchException
        at 博猫娱乐场.util.Scanner.throwFor(Unknown Source)
        at 博猫娱乐场.util.Scanner.next(Unknown Source)
        at 博猫娱乐场.util.Scanner.nextInt(Unknown Source)
        at 博猫娱乐场.util.Scanner.nextInt(Unknown Source)
        at text.text.main(text.博猫娱乐场:11)

异常类型

为了能够及时有效地处理程序中的运行错误,Java 专门引入了异常类。在 Java 中所有异常类型都是内置类 博猫娱乐场.lang.Throwable 类的子类▄▓,即 Throwable 位于异常类层次结构的顶层。Throwable 类下有两个异常分支 Exception 和 Error,如图 1 所示▓█。



图 1  异常结构图

由图 2 可以知道,Throwable 类是所有异常和错误的超类,下面有 Error 和 Exception 两个子类分别表示错误和异常█■▄。其中异常类 Exception 又分为运行时异常非运行时异常,这两种异常有很大的区别,也称为不检查异常(Unchecked Exception███)检查异常(Checked Exception)
本节不讨论关于 Error 类型的异常处理,因为它们通常是灾难性的致命错误■■■,不是程序可以控制的。接下来将讨论 Exception 类型的异常处理。

运行时异常都是 RuntimeException 类及其子类异常▄■▄■,如 NullPointerException、IndexOutOfBoundsException 等,这些异常是不检查异常▓▄▓▄,程序中可以选择捕获处理,也可以不处理。这些异常一般由程序逻辑错误引起▄▓,程序应该从逻辑角度尽可能避免这类异常的发生▓█▄■。

非运行时异常是指 RuntimeException 以外的异常,类型上都属于 Exception 类及其子类。从程序语法角度讲是必须进行处理的异常▄■▓,如果不处理,程序就不能编译通过。如 IOException▄▓、ClassNotFoundException 等以及用户自定义的 Exception 异常(一般情况下不自定义检查异常)。

表 1 和表 2 分别列出了 博猫娱乐场.lang 中定义的运行时异常和非运行时异常的类型及作用▓█。

表 1 Java中常见运行时异常
异常类型 说明
ArithmeticException 算术错误异常,如以零做除数
ArraylndexOutOfBoundException 数组索引越界
ArrayStoreException 向类型不兼容的数组元素赋值
ClassCastException 类型转换异常
IllegalArgumentException 使用非法实参调用方法
lIIegalStateException 环境或应用程序处于不正确的状态
lIIegalThreadStateException 被请求的操作与当前线程状态不兼容
IndexOutOfBoundsException 某种类型的索引越界
NullPointerException 尝试访问 null 对象成员,空指针异常
NegativeArraySizeException 再负数范围内创建的数组
NumberFormatException 数字转化格式异常█■▄,比如字符串到 float 型数字的转换无效
TypeNotPresentException 类型未找到

表 2 Java常见非运行时异常
异常类型 说明
ClassNotFoundException 没有找到类
IllegalAccessException 访问类被拒绝
InstantiationException 试图创建抽象类或接口的对象
InterruptedException 线程被另一个线程中断
NoSuchFieldException 请求的域不存在
NoSuchMethodException 请求的方法不存在
ReflectiveOperationException 与反射有关的异常的超类

编程帮,一个分享编程知识的公众号。跟着站长一起学习███,每天都有进步。

通俗易懂,深入浅出▓▓,一篇文章只讲一个知识点。

文章不深奥,不需要钻研▄■▄,在公交、在地铁、在厕所都可以阅读■■■,随时随地涨姿势。

文章不涉及代码,不烧脑细胞▄■▄■,人人都可以学习。

当你决定关注「编程帮」,你已然超越了90%的程序员▓▄▓▄!

编程帮二维码
微信扫描二维码关注

所有教程

优秀文章