现在是2020年9月20日16:33:30,继续对上次博客的异常类做介绍。
异常(Exception)[续]
2、异常的处理
当程序出现异常时,如果没有做适当的处理,则系统运行到错误代码时,将直接终止系统,不会再向下执行代码,异常的处理方式有以下两种:
(1)第一种方式: 捕捉异常(try-catch-finally)
a) 如果该代码块中的异常在本方法体内可以解决,则使用try-catch进行处理;
b) try-catch-finally分为三个子模块:排查异常代码块的try{}模块,展示错误信息的catch(){}模块以及善后处理资源的finally{}模块,finally{}模块与其他两个模块可以独立开来。另外,try模块也可以分别与catch模块或者finally模块组合。
c) try-catch的执行逻辑是这样的:在try中包括了要排查异常的代码块;在catch中声明了要排查的异常范围。如果在try模块中发生了catch模块中指定的异常范围,则将报告异常后继续向下执行代码。其中catch模块可以有多个,但是必须遵循从小异常到大异常的异常罗列,因为当大异常放在第一个catch模块时,下面的catch模块不会再执行。
d) 报错后必须处理完的还没有处理完的,如资源的关闭等,需要在finally{}模块中继续处理完,否则可不写finally{}模块。
(2) 第二种方式:上抛异常(throws + 异常类)
a) 如果当前方法体中没办法解决异常或者需要交给上层处理该异常时,需要使用throws关键字向上抛出异常。何为上层?要调用该方法的那个方法就可以认为是该方法的上层。main方法的上层是Java虚拟机,Java虚拟机无法处理异常时异常终止系统。
b) throws 异常,只需在方法首部的形参列表右括号后添加 throws + 需要向上抛出的异常类名 即可。
c) 定义的方法如果有throws 异常,必须在调用该方法时对可能出现的异常进行处理。
(3) 测试代码如下:
package cn.drgn.javase.api.exception;
/**
* Create by Drgn on 2020/9/18 16:21
*/
public class ExceptionTest {
public static void main(String[] args) {
/* 处理异常的第一种方式:
try{
// 要排查异常或者要处理异常的代码块
}catch(异常类形参){
// 打印错误信息或者其他信息
// catch(){}模块可以重复写,但是异常类形参的异常范围必须从小到大,
// 因为如果先写的异常范围比较大的话,就不会继续接下来的catch模块,无法获得更详细的异常错误信息
// 通常是打印详细信息:
e.printStackTrace();
}
*/
try {
int i = 23 / 0;
} catch (ArithmeticException e) {
// 打印详细的错误信息
e.printStackTrace();
} catch (Exception e) {
// 打印简单的错误信息
System.out.println(e.getMessage());
} finally {
System.out.println("处理发生异常后也要处理的操作....");
}
// 处理aMethod方法中的异常,同样可以有两种方式:throws 和 try-catch,这里采用后者
try {
// 调用了可能出现异常的方法,需要在调用时对异常进行处理
aMethod();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("hello world!");
// 测试try-finally
bMethod();
System.out.println("hello~~~");
}
/*
* 处理异常的第二种方式:throws 异常
* 在方法首部后面添加 throws + 需要向上抛出的异常类名
*/
public static void aMethod() throws Exception {
int a = 12 / 0;
System.out.println("aMethod.....");
}
// try-finally测试
public static void bMethod() {
try{
int a = 13 / 0;
} finally {
System.out.println("善后处理...");
}
}
}
测试结果如下:
3、自定义异常
直接上测试代码,其中的注释说明了如何自定义异常,模拟自定义除数不可为0异常。
(1)自定义异常类
package cn.drgn.javase.api.exception.custom;
/**
* Create by Drgn on 2020/9/18 22:00
* 自定义异常类
* 步骤如下:自定义继承Exception类的子类,创建构造方法即可
*
*/
public class MyException extends Exception {
public MyException(){}
public MyException(String message){
super(message);
}
}
(2)测试自定义异常类
package cn.drgn.javase.api.exception.custom;
import java.util.Scanner;
/**
* Create by Drgn on 2020/9/18 22:03
* 使用:
* (1) 在需要抛出异常的位置使用throw关键字抛出该自定义异常类的对象,并传入错误信息
* (2) 在 throw 自定义异常语句所属的方法形参列表后 throws 该异常
*/
public class MyExceptionTest {
public static void main(String[] args) {
// 输入数据
Scanner sc = new Scanner(System.in);
System.out.print("请输入除数:");
int a = sc.nextInt();
System.out.print("请输入被除数:");
int b = sc.nextInt();
// 捕捉异常
try {
int res = div(a, b);
System.out.println(res);
} catch (MyException e) {
e.printStackTrace();
}
}
// throws 异常
public static int div(int a, int b) throws MyException {
if (b == 0) {
// throw 自定义异常对象,传入错误信息
throw new MyException("除数不能为0!");
}
return a / b;
}
}
(3)测试结果
好的,以上便是异常处理以及简单的自定义异常,这次对异常的分享先到这里,谢谢阅读。有问题望请指正!