Java API之异常类(二)20200920

现在是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)测试结果
在这里插入图片描述
好的,以上便是异常处理以及简单的自定义异常,这次对异常的分享先到这里,谢谢阅读。有问题望请指正!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值