Throwable体系结构
- throwable
java.lang.Throwable 类是Java程序执行过程中发生的异常事件对应的类的根父类。
1.Throwable的体系结构
从这张图中,我们可以看到结构为
Object——>throwable——>error
Object——>throwable ——>Exception——>RuntimeException
1.1 error与Exception
error:错误。Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。
一般不编写针对性的代码进行处理。
Exception:异常。指的是程序在执行过程中,出现的非正常情况,如果不处理最终会导致JVM的非正常停止。我们可以编写针对性的代码进行处理。
1.2 Exception的Exception和RuntimeException
我们可以从结构图中看到,Exception中包含了许多的子异常类
一般我们可以将Exception分为两类:
运行时异常(RuntimeException)
编译时异常(Exception类中除了RuntimeException类的其他类)
2.Error(错误)
error:错误。Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。
一般不编写针对性的代码进行处理。
下图为Error的API。
常见的Error
StackOverflowError(堆栈异常错误)
OutOfMemoryError(内存溢出错误)
3.Exception(异常)
我们知道,我们编写的Java文件要通过 javac.exe 来进行编译,通过 java.exe 来进行运行。
于是我们把异常分为两类:
3.1 编译时异常
1.编译时异常
即checked异常、受检异常):在代码编译阶段,编译器就能明确
警示
当前代码可能发生(不是一定发生)
xx异常,并明确督促
程序员提前编写处理它的代码。如果程序员没有编写
对应的异常处理代码,则编译器就会直接判定编译失败,从而不能生成字节码文件。通常,这类异常的发生不是由程序员的代码引起的,或者不是靠加简单判断就可以避免的,例如:FileNotFoundException(文件找不到异常)
上图是一个表示文件读写的方法,它可能会报FileNotFoundException和IOException。这两个异常都是编译时的异常。
所以说,编译时的异常我们在编写代码时,编辑器会进行检查,一旦发现可能发生异常就会直接爆红
注意: 爆红不是表示有错误,而是表示可能会出错
我们尝试运行,结果如下图
我们会发现,程序压根没有运行,因为编译时异常是无法通过编译的
因为编译时异常,编辑器会进行检查,所以我们又称“编译时异常”为受检异常
而运行时异常,编辑器不会进行检查,又被称作非受检异常
2.常见的编译时异常
ClassNotFoundException:类找不到异常
FileNotFoundException:文件未发现异常
IOException:IO异常
2.运行时异常(RuntimeException)
即runtime异常、unchecked异常、非受检异常):在代码编译阶段,编译器完全不做任何检查,无论该异常是否会发生,编译器都不给出任何提示。只有等代码运行起来并确实发生了xx异常,它才能被发现。通常,这类异常是由程序员的代码编写不当引起的,只要稍加判断,或者细心检查就可以避免。
上图是一个运行时异常(除0异常)
但是和编译时异常相比,我们发现它不会爆红。
运行后,控制台会出现以下信息
错误信息:ArithmeticException: / by zero(算术异常中的除0异常)
可以发现,程序是运行了的,只是运行被中止了。
常见的RuntimeException
ArrayIndexOutOfBoundsException:数组下标越界异常
NullPointerException:空指针异常
ClassCastException:强制类型转换异常
NumberFormatException:数据格式异常
InputMismatchException:输入不匹配异常
ArithmeticException:算术异常