【Java进阶】从异常机制认识常见碧油鸡(bug)

135 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。


异常机制

1.异常的概念

什么是异常?百度百科是这么说的,异常指的是在程序运行过程中发生的异常事件,通常是由外部问题(如硬件错误、输入错误)所导致的。在Java等面向对象的编程语言中异常属于对象。

通俗地理解,就是当程序读取数据库数据时,数据是空的;程序要打开某个文件时,文件不存在或是文件格式不对;当访问数组时,访问的位置超过数组长度……这些所产生的问题,都称为异常(Exception)

2.分类

(1)Error

Error是“错误”的意思,表示严重的问题,合理的应用程序不应该试图捕获。比如硬件问题、内存资源不足等。

(2)RuntimeException

RuntimeException是“运行时异常”的意思,是指在编译期间不进行检查,但出现问题后就需要去修改代码。

(3)非RuntimeException

非RuntimeException是指非运行时异常,也有称为检查时异常,即程序在编译期间就必须处理的异常,否则程序将无法通过编译,更无法正常运行。

3.异常体系结构

Throwbale.png

(1)Error
  • VirtualMachineError:表示Java虚拟机已损坏或已耗尽资源以使其继续运行。
    • StackOverFlowError:表示堆栈大小超过内存分配的限制。
    • OutOfMemoryError:表示Java虚拟机由于内存不足而无法分配对象,且垃圾收集器不再有可用的内存。
  • AWTError:表示出现了严重的抽象窗口工具包错误。
(2)Exception
  • IOException:表示输入输出异常,可能是由失败或中断的I / O操作产生的。
    • EOFException:表示在输入过程中意外地到达文件结束或流结束。许多其他输入操作在流的末尾返回特殊值,而不是抛出异常。
    • FileNotFoundException:表示通过指定路径找不到文件。
  • RuntimeException
    • ArithmeticException:表示算术异常,比如“1/0”则会抛出该异常。
    • MissingResourceException:表示资源丢失。
    • ClassNotFoundException:表示应用程序尝试通过其字符串名称加载到类。也就是找不到类包,一般原因是没有导包或者导包不完整。
    • NullPointerException:表示空指针异常,即空引用,引用本身为空,却调用了方法。
    • IllegalArgumentException:表示传递了非法参数。
    • ArrayIndexOutOfBoundsException:表示使用非法索引访问数组,索引为负数或大于或等于数组大小。

4.基本框架

/*
    处理异常的基本框架
 */
try {                       // 监控区域
                            // 可能发送异常的语句
} catch (Exception e) {     // 捕获异常,Exception可以是其它类型的异常
    e.printStackTrace();    // 向控制台打印异常信息
} finally {                 // 善后处理,无论是否发生异常,都会执行
                            // IO流中可以用于释放资源
}

5.自定义异常

在实际的开发过程中,当 JDK 中的异常类型不能满足程序的需要时(也即需要定义具体的业务异常时),我们则可以自定义异常,比如BusinessException、LoginException等。

自定义异常一般的步骤如下:

[1] 确定异常类型(检查时异常、运行时异常)

[2] 继承异常的父类(Exception、RuntimeException)

[3] 声明构造方法

public class BusinessException extends RuntimeException {
    private static final long serialVersionUID = 1L;
    
    protected final String message;

    public BusinessException(String message) {
        this.message = message;
    }

    public BusinessException(String message, Throwable e) {
        super(message, e);
        this.message = message;
    }

    @Override
    public String getMessage() {
        return message;
    }
}