Java异常
一、异常简介
什么是异常
异常本质上是程序的错误,错误在我们编写程序的过程中经常发生,包括编译期间和运行期间的错误,
编译期间错误编译器会给出提示、运行期间错误编译器不会提示,往往难以所料
异常的分类

- Java中通过Throwable及其相关子类对异常进行描述
- Error是程序无法处理的错误,表示运行应用程序中较严重的问题,这类错误是不可查的,不需要处理它所引起的异常
- Exception是程序本身可以处理的异常。异常处理通常指的是对这种类型或其子类进行处理
- Unchecked Exception(非检查异常)编译器不要求强制处置的异常,RuntimeException子类就是非检查异常
- Checked Exception(检查异常)编译器要求必须处置的异常,除了RuntimeException的子类基本都是检查异常
二、异常处理简介
异常处理机制为:先抛出异常,后捕获异常
抛出异常:当一个方法中出现错误引发的异常时,方法会创建异常对象并交付给运行时系统进行处理,异常对象通常包含异常类型及异常出现时的程序状态等
捕获异常:运行时系统捕获到异常后,会去寻找合适的处理器,如果找到与之匹配的处理器就会执行相关的处理逻辑,如果始终没找到,运行时系统将会终止,即Java程序终止运行
Java规定:对于可查异常必须捕获,或者声明抛出;允许忽略不可查的RuntimeException和Error
try-catch-finally用于捕获异常、throws声明可能要抛出的异常、throw手动抛出异常,例如:throw new Exception("我是一个异常");
三、异常处理
使用try-catch-finally实现异常处理:
try块负责抛出异常,catch块负责捕获异常,finally块无论如何都会执行
try块后可跟一个或多个catch块,如果没有catch块,则必须跟一个finally块
应用多重catch进行异常捕获时,需要注意范围,即大范围(父类)后置,建议在catch块最后加一个父类异常Exception用于捕获意料之外的异常
e.printStackTrace();可以打印出错误的堆栈信息,包括错误的描述、错误的类型、错误出现的位置,但输出位置是随机的
return不能打断finally块的执行,所以不建议在finally中写return语句
System.exit(1);终止当前正在运行的Java虚拟机,且不会执行finally块中代码
使用throw和throws实现异常处理:
如果一个方法可能会出现异常,但却没有能力处理这种异常,可以在方法声明处用throws子句来声明抛出异常,谁调用这个方法,谁就来处理它
throws后可跟单个或多个异常类型,不可跟异常对象
throw抛出异常两种处理方案:1.通过try-catch包含throw语句,自己抛出自己处理 2.通过throws向上抛出,谁调用谁处理
异常的抛出也可以实现一些特定的业务逻辑处理方案
四、自定义异常
可以通过自定义异常描述特定业务产生的异常类型
public class MyException extends Throwable{
public MyException (){
super("我是一个异常");
}
}
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
int n=scanner.nextInt();
if(n!=1){
try {
throw new MyException();
} catch (MyException e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
五、异常链
将异常产生的原因一个传一个串起来,即把底层的异常信息传给上层,这样逐层抛出
public class Test {
public static void main(String[] args) throws IOException {
try {
testThree();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void testOne() throws MyException{
throw new MyException();
}
public static void testTwo() throws Exception {
try {
testOne();
} catch (MyException e) {
throw new Exception("我是新产生的异常1",e);
}
}
public static void testThree() throws Exception {
try {
testTwo();
} catch (Exception e) {
// throw new Exception("我是新产生的异常2",e);
Exception exception=new Exception("我是新产生的异常2");
exception.initCause(e);
throw exception;
}
}
}

浙公网安备 33010602011771号