【笔记】Java的异常

前言

Java的异常处理学习笔记

概念

  • 封装错误信息的对象

错误信息

  • 类型
  • 提示消息
  • 行号

常见异常的继承结构

Throwable

Error:系统级错误
Exception

NullPointerException
ArrayIndexOutOfBoundsException
NumberFormatException
ClassCastException
ClassNotFoundException

catch

  • 捕获异常

AExceptionBException:任意一种异常

1
2
3
4
5
try {
...
} catch(Exception e) {
...
}

多个异常

1
2
3
4
5
6
7
try {
...
} catch(AException a) {
...
} catch(BException b) {
...
}

finally

  • 不管出错还是不出错都会执行(无论return还是break
1
2
3
4
5
6
7
try {
...
} catch(Exception e) {
...
} finally {
...
}

throws

  • 在方法上设置异常的抛出管道
1
2
3
void function() throws Exception {
...
}
  • 方法上有默认的异常管道类型RuntimeException

抛出多个异常

1
2
3
void function() throws AException, BException {
...
}

异常的注意事项

  • 异常处理只有两种方式:catchthrows

  • 异常处理,必须二选一

  • Java语法强制开发者事先考虑异常如何处理

  • 初级开发者,可能会捕获,但不处理异常

  • 方法重写时,异常管道不能比父类方法多

如何选择

  • 底层异常,应该向前抛到前面处理
  • 经验少时不知道该在什么位置捕获处理,应该选择throws

throw

  • 手动抛出异常,执行异常的抛出动作
  • 类比成return

创建异常

1
AException e = new AException();

重载方法

<str>:提示信息

1
AException e = new AException(<str>);

抛出异常

1
throw e;

异常包装

  • 捕获的异常,包装成另一种类型,再抛出
1
2
3
4
5
try {
...
} catch(AException e) {
throw new BException(e);
}

使用场景

  • 不能抛的异常类型,包装成能抛出的类型,再抛
  • 异常简化,把多种类型异常,简化成一种

自定义的异常

  • 现有异常类型不能表示业务中所有的异常情况

过程

起一个合适的类名

  • 本例为用户名有误异常
1
2
3
public class UsernameNotFoundException {
...
}

继承一个合适的异常父类

1
2
3
public class UsernameNotFoundException extends Exception {
...
}

添加合适的构造方法

  • 参考父类构造方法参数,在子类添加相同的构造方法
无参构造
  • 默认构造方法
String类型参数
  • 异常信息的描述
Throwable类型参数
  • 包装其他异常类型

完成