一、Java内置异常体系分类
1、Throwable类
Java.lang软件包中有一个java.lang.Throwable类,这个类是java中所有错误和异常的超类
Throwable类有两个子类,Error与 Exception
2、Error 错误
代表系统级别的错误,通常是JVM(Java虚拟机)相关的错误,如OutOfMemoryError
(内存溢出错误)等。
这些错误通常是不可恢复的,并且大多数应用程序不应该试图去捕获或处理它们。
常见程序错误分三类:
-
编译错误:没遵循语法规范
-
运行时错误:程序在执行时
-
逻辑错误:程序没有按照预期的逻辑顺序执行
3、Exception 异常
代表程序可能出现的问题,在编程时需要重点关注的。
Exception
类又可以分为运行时异常(RuntimeException
)和非运行时异常(即编译时异常或已检查异常)。
4、运行时异常(RuntimeException子类)
不可查异常,是那些可能在Java虚拟机正常运行期间抛出的异常,但是编译器不会检查这类异常是否被处理;如果编写了一个可能会抛出运行时异常的方法,不需要在方法签名中使用throws
关键字来声明这个方法会抛出这些异常
-
常见的运行时异常包括:
-
NullPointerException
:当应用程序试图在需要对象的地方使用null
时抛出。 -
ClassCastException
强制失败抛出异常 -
ArrayIndexOutOfBoundsException
:当应用程序试图访问数组的非法索引时抛出。 -
ArithmeticException
:当出现异常的算术运算条件时抛出,例如除以零。
-
5、非运行时异常(编译时异常或已检查异常,必须要在方法里面捕获或者抛出)
可查异常,是那些编译器会检查是否已经被处理的异常。如果编写了一个可能会抛出非运行时异常的方法,必须在方法签名中使用throws
关键字来声明这个方法会抛出这些异常。调用这个方法的代码也必须处理这些异常,或者使用throws
关键字再次声明这些方法也可能会抛出这些异常。
- 常见的非运行时异常包括:
ClassNoFoundException
应用程序试图加载类,找不到对应的类IllegalAccessException
拒绝访问一个类的时候NoSuchFieldExcetion
请求的变量不存在NoSuchMethodException
方法不存在IOException
:当发生输入/输出错误时抛出。-
SQLException
:当使用JDBC(Java Database Connectivity)与数据库交互时,发生SQL错误或数据库访问错误时抛出。
6、Throwable类定义了一些用于处理错误和异常的核心方法
(1) public String getMessage():异常的详细信息
(2) public Throwable getCause():异常原因
(3) public void printStackTrace():打印错误的堆栈信息,即错误输出流,可以看到错误原因和所在位置
7、异常处理机制
Java提供了五个关键字来处理异常:try
、catch
、finally
、throw
和throws
。
-
try:包含可能出现异常的代码块。
-
catch:用于捕获try块中抛出的异常,并处理它。
-
finally:无论try块中的代码是否抛出异常,finally块中的代码都会被执行。它常用于关闭资源或进行清理工作。
-
throw:用于显式地抛出一个异常,需要是
new 异常类
-
throws:用于声明一个方法可能会抛出的异常,但不处理它,即往外抛。throws子句放在方法参数列表的右括号之后,一个方法可以声明抛出多个异常,多个异常之间用逗号隔开
总结:当抛出一个被检查的异常,我们必须使用try-catch块来处理它,或者在方法声明中使用throws子句继续往外抛,由调用该方法去处理异常。
二、多重捕获处理
多重捕获(Multiple Catch)是Java异常处理中的一个重要概念,它允许在单个try块后面跟随多个catch块,捕获不同类型的异常,这种机制使得代码更加清晰和易于管理,特别是在处理多种可能的异常时。
语法:
1、结构:一个try
代码块后面可以跟随多个catch
代码块,每个catch
代码块用于捕获并处理不同类型的异常。
2、顺序:catch
代码块的顺序很重要。Java会按照catch
代码块的顺序进行匹配,将更具体的异常类型放在前面
3、finally块:在try/catch
后面添加finally
块是可选的,无论是否发生异常,finally
代码块的代码总会被执行。finally
块通常用于执行清理操作,如关闭文件或数据库连接。
三、自定义异常
如何进行自定义异常:
(1)、异常都是继承自Exception类,所以我们要自定义的异常也需要继承这个基类。
(2)、定义一个新的异常类:继承自Exception
或RuntimeException
。
(3)、提供构造函数:提供一个或多个构造函数,这些构造函数可以接受一个描述异常详情的字符串,并传递给父类的构造函数。
(4)、(可选)添加其他方法:根据需要,还可以在自定义异常类中添加其他方法或字段。