2023年11月29日发(作者:)

Java异常类与⾃定义异常

⾸先,什么是异常?

我们先来看jdk1.8的API对异常的定义

异常:程序执⾏中的⾮正常事件,程序⽆法再按预想的流程执⾏,就是Java程序在运⾏过程中出现的错误。

异常Exception这个东西常常和error混淆,但是他们有本质的区别:

后者简⽽⾔之就是将错误信息传递给上层调⽤者,并报告“案发现场”的信息

异常到底是个什么东西?

⽽在RuntimeException中⼜派⽣出了很多的⼦类,许多都是我们常见的异常

Checkedunchecked异常

这是从异常处理机制的⾓度所做的分类:异常会被谁check?——编译器(checked)、程序员(unchecked)

下⾯这张图可以帮助我们很好的理解Java中的异常分类

总的说⼀下,体现在编程上:

⽽Checked exceptions必须捕获并指定错误处理器handler,否则编译⽆法通过,类似于编程语⾔中的静态类型检查

checked异常必须使⽤throws声明或try/catch进⾏捕获,否则⽆法通过编译

如果客户端可以通过其他的⽅法恢复异常,那么采⽤checked exception,例如读⽂件的时候发现⽂件不存在了,可以让⽤户选择其他

⽂件

如果客户端对出现的这种异常⽆能为⼒,例如系统损毁,那么采⽤unchecked exception;

⽽对于⼀些编程错误,可以使⽤unchecked exception来处理,例如调⽤某⽅法时传⼊了错误的参数,则⽆论如何都⽆法在不中⽌执

public class Test {

public boolean readFromFile() throws IOException {

...

}

}

class SubType extends Test {

@Override public boolean readFromFile() throws FileNotFoundException {

...

}

}

因为FileNotFoundException是IOException的⼦类型,所以⼦类重新⽅法中可以将异常类型改为FileNotFoundException

如何⾃定义⼀个异常?

⾸先还是那句话,看⼀下Exception的API⽂档

我们有三种选择:

1. 继承Throwable

2. 继承Exception

3. 继承RuntimeException

通常情况下都会选择继承Exception和RuntimeException,如果不要求调⽤者⼀定要处理抛出的异常,可以继承RuntimeException,⽽

对RuntimeException通常是是逻辑上的错误,⽐如数组越界,空指针异常。

如果是需要调⽤者处理的异常,通常情况之下都选择继承 Exception

创建异常类后,通常需要⼀个构造⽅法

⾸先看⼀下⽗类Exception中的⼏种构造⽅法

public Exception() {

}

构造⼀个新的异常,其详细信息(message)为null。 产⽣异常的原因尚未初始化,并且随后可以通过调⽤

use(ble)进⾏初始化。

public Exception(String message) {

super(message);

}

使⽤指定的message构造⼀个新的异常。 原因尚未初始化,并且随后可以通过调⽤use(ble)进⾏初

始化。

参数:

message-详细消息。 将保存详细消息,以供以后通过调⽤⽗类中sage()⽅法检索。

public Exception(String message, Throwable cause) {

super(message, cause);

}

使⽤指定的message和cause构造⼀个新异常。

请注意,与原因关联的详细消息不会⾃动合并到此异常的详细消息中。

参数:

message-详细消息(保存此消息以供sage()⽅法以后检索)。

cause-产⽣异常的原因(保存该原因,以便以后通过se()⽅法进⾏检索)。 (允许使⽤空值,并指⽰原因不存在或

未知。)

protected Exception(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {

super(message, cause, enableSuppression, writableStackTrace);

}

使⽤指定的message,cause,启⽤或禁⽤抑制以及可写的堆栈跟踪启⽤或禁⽤,构造⼀个新异常。

参数:

message-详细消息。

cause-原因。 (允许使⽤null,表⽰cause不存在或未知。)

enableSuppression-是否启⽤或禁⽤抑制

writableStackTrace-堆栈跟踪是否应该写⼊

那么我们在编写异常类的时候同样可以参考这些构造⽅法进⾏产⽣异常后的操作

package Exception;

public class MyException extends Exception{

private String message;

public MyException() {

}

public MyException(String message) {

super(message);

}

public MyException(String message, Throwable cause) {

super(message, cause);

}

public MyException(Throwable cause) {

super(cause);

}

protected MyException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {

super(message, cause, enableSuppression, writableStackTrace);

}

}

在编写完异常类后,我们可以编写测试代码对其进⾏测试,在⼀些⽅法总检测条件是否满⾜并⽤throw抛出异常,⽤其调⽤者检测并处理异

常或是不处理交给JVM并输出在控制台。