3、自定义异常
# 自定义异常
在业务代码中,有时候需要自定义异常,异常的返回结果可以根据业务进行调整。
自定义异常的时候,尽量使用JDK已定义的异常类型,比如以下常见的异常类:
Exception
├─ RuntimeException
│ ├─ NullPointerException
│ ├─ IndexOutOfBoundsException
│ ├─ SecurityException
│ └─ IllegalArgumentException
│ └─ NumberFormatException
├─ IOException
│ ├─ UnsupportedCharsetException
│ ├─ FileNotFoundException
│ └─ SocketException
├─ ParseException
├─ GeneralSecurityException
├─ SQLException
└─ TimeoutException
eg:
五菱宏光厂商为了能快速为用户定位更换轮胎的错误,于是加入了错误码,通过错误码就能立即知道错误原因了。
对于代码实现就是自定义了一个ChangeWeelException
异常类,继承于RuntimeException
。
class ChangeWeelException extends RuntimeException {
private int errorCode;
private String errorMessage;
ChangeWeelException(int errorCode, String errorMessage) {
this.errorCode = errorCode; //自定义构造函数,加入错误码字段
this.errorMessage = errorMessage;
}
public int getErrorCode() {
return errorCode;
}
public String getErrorMessage() {
return errorMessage;
}
}
public class WuLingHongGuang {
private String[] weels = {"左1", "左2", "后1", "后2", "备胎1"};
void changeWeel(int index, String weelName) throws ChangeWeelException { //throws 关键字,表示方法可能会抛出异常
if (index > weels.length) {
throw new ChangeWeelException(50001, "ERROR!!!轮胎安装位置错误了!"); //throw 关键字,直接抛出异常
} else {
weels[index] = weelName;
}
}
}
class HaC {
public static void main(String[] args) {
WuLingHongGuang wuLingHongGuang = new WuLingHongGuang();
try {
wuLingHongGuang.changeWeel(10, "备胎2"); //捕获异常
System.out.println("更换成功"); //报错并不会执行
} catch (ChangeWeelException e) {
e.printStackTrace();
System.out.println("错误码:" + e.getErrorCode());
System.out.println("错误提示:" + e.getErrorMessage());
} finally {
System.out.println("更换完毕...");
}
}
}
输出:
com.hac.异常.ChangeWeelException
at com.hac.异常.WuLingHongGuang.changeWeel(WuLingHongGuang.java:33)
at com.hac.异常.HaC.main(WuLingHongGuang.java:49)
错误码:50001
错误提示:ERROR!!!轮胎安装位置错误了!
更换完毕...
# 断言
另外还有个知识点就是断言。(了解即可)
断言:也就是所谓的assertion,是jdk1.4后加入的新功能。
它主要使用在代码开发和测试时期,用于对某些关键数据的判断,如果这个关键数据不是你程序所预期的数据,程序就提出警告或退出。
当项目正式发布后(上线),可以取消断言部分的代码。java中使用assert
作为断言的一个关键字,这就可以看出java对断言还是很重视的,因为如果不是很重要的话,直接开发个类就可以了,没必要新定义一个关键字。
语法1:
assert expression; //expression代表一个布尔类型的表达式,如果为真,就继续正常运行,如果为假,程序退出
语法2:
assert expression1 : expression2;
//expression1是一个布尔表达式,expression2是一个基本类型或者Object类型,
//如果expression1为真,则程序忽略expression2继续运行;如果expression1为假,则运行expression2,然后退出程序。
应用举例1:
public class AssertionDemo {
//这个成员变量的值可以变,但最终必须还是回到原值5
static int i = 5;
public static void main(String[] args) {
assert i==6;
System.out.println("如果断言正常,我就被打印");
}
}
输出:
# 总结:
在自定义异常的时候,一般都是从RuntimeException
派生出子异常,在自定义异常的时候,可以根据业务定义多种构造方法。
但是在实际的业务中,e.printStackTrace();
可能会抛出很长的一段错误日志,这样会欲盖弥彰,如何打印错误日志,也是开发人员需要考虑。
在日志框架中,我们还可以使用Log4j、Sl4j 这些第三方API 库,而不是使用System.out.println()
打印。
总结这三节有关异常的知识点:
上次更新: 2024-05-23 10:33:15