Java 异常处理
Java 的异常处理是 Java 语言的一大重要特性,也是提高代码健壮性的最强大方法之一。当我们编写了错误的代码时,编译器在编译期间可能会抛出异常,有时候即使编译正常,在运行代码的时候也可能会抛出异常。
目标:
什么是异常
Java 中异常类的架构
如何进行异常处理
如何自定义异常
什么是异常链
如何使用异常链
前言
1.8/25
2.编程不能停,成为运维开发性人才
3.计算机408基础打好,编程语言学精通,然后走下去
4.Docker和K8s继续
1. 什么是异常
异常就是程序上的错误,我们在编写程序的时候经常会产生错误,这些错误划分为编译期间的错误和运行期间的错误。
下面我们来看几个常见的异常案例。
如果语句漏写分号,程序在编译期间就会抛出异常,实例如下:
public class Hello { public static void main(String[] args) { System.out.println("Hello World!") } }
运行结果:
$ javac Hello.java Hello.java:3: 错误: 需要';' System.out.println("Hello World!") ^ 1 个错误
static 关键字写成了 statci,实例如下:
Hello.java:2: 错误: 需要<标识符> public statci void main(String[] args) { ^ 1 个错误
当数组下标越界,程序在编译阶段不会发生错误,但在运行时会抛出异常。实例如下:
public class ArrayOutOfIndex { public static void main(String[] args) { int[] arr = {1, 2, 3}; System.out.println(arr[3]); } }
运行结果:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3 at ArrayOutOfIndex.main(ArrayOutOfIndex.java:4)
2. Java 异常类架构
在 Java 中,通过 Throwable 及其子类来描述各种不同类型的异常。如下是 Java 异常类的架构图(不是全部,只展示部分类):
2.1 Throwable 类
Throwable 位于 java.lang 包下,它是 Java 语言中所有错误(Error)和异常(Exception)的父类。
Throwable 包含了其线程创建时线程执行堆栈的快照,它提供了 printStackTrace() 等接口用于获取堆栈跟踪数据等信息。
主要方法:
fillInStackTrace: 用当前的调用栈层次填充 Throwable 对象栈层次,添加到栈层次任何先前信息中;
getMessage:返回关于发生的异常的详细信息。这个消息在 Throwable 类的构造函数中初始化了;
getCause:返回一个 Throwable 对象代表异常原因;
getStackTrace:返回一个包含堆栈层次的数组。下标为 0 的元素代表栈顶,最后一个元素代表方法调用堆栈的栈底;
printStackTrace:打印 toString() 结果和栈层次到 System.err,即错误输出流。
2.2 Error 类
Error 是 Throwable 的一个直接子类,它可以指示合理的应用程序不应该尝试捕获的严重问题。这些错误在应用程序的控制和处理能力之外,编译器不会检查 Error,对于设计合理的应用程序来说,即使发生了错误,本质上也无法通过异常处理来解决其所引起的异常状况。
常见 Error:
AssertionError:断言错误;
VirtualMachineError:虚拟机错误;
UnsupportedClassVersionError:Java 类版本错误;
OutOfMemoryError :内存溢出错误。
2.3 Exception 类
Exception 是 Throwable 的一个直接子类。它指示合理的应用程序可能希望捕获的条件。
Exception 又包括 Unchecked Exception(非检查异常)和 Checked Exception(检查异常)两大类别。
2.3.1 Unchecked Exception (非检查异常)
Unchecked Exception 是编译器不要求强制处理的异常,包含 RuntimeException 以及它的相关子类。我们编写代码时即使不去处理此类异常,程序还是会编译通过。
常见非检查异常:
NullPointerException:空指针异常;
ArithmeticException:算数异常;
ArrayIndexOutOfBoundsException:数组下标越界异常;
ClassCastException:类型转换异常。
2.3.2 Checked Exception(检查异常)
Checked Exception 是编译器要求必须处理的异常,除了 RuntimeException 以及它的子类,都是 Checked Exception 异常。我们在程序编写时就必须处理此类异常,否则程序无法编译通过。
常见检查异常:
IOException:IO 异常
SQLException:SQL 异常