一文读懂异常处理

什么是异常

异常通常指方法在不能正常运行的时候,通过抛出异常的方式退出方法。

异常的分类

在这里插入图片描述

  • Throwable是所有错误和异常的父类。
  • Error通常是系统错误,或者资源耗尽,如果出现Error,系统就会终止运行,停止工作,常见Error有OutOfMemory(内存溢出),ThreadDeath(线程死锁)等等。
  • Exception又被分为两种,一是运行时异常(RunTimeException),而是检查异常(CheckedException)。

  运行时异常:指Java虚拟机在运行期间抛出的异常,这种程序发生错误抛出的异常,我们通常是捕获处理异常,或者抛出异常。常见的运行时异常有NullPointerException(空指针异常),ClassCastException(类型转换异常),ArrayIndexOutOfBundsException(数组越界异常)等等。
  检查异常:指在编译阶段Java编译器会检查CheckedException异常,并强制程序处理此异常,否则无法通过编译。常见的检查异常有SQLException(SQL异常),IOException(IO异常),ClassNotFoundException(文件未找到)等等。

处理异常

  处理异常有两种方式,一是用try,catch语句块来处理,二是抛出异常。

  1. try,catch
    使用try,catch捕获异常更有针对性,我们只需要可能出现异常的代码,放在try语句块里面,就能捕获可能出现的异常,然后在catch语句块里面做相应的处理即可。
    public static void main(String[] args) {
        int a = 1;
        int b = 0;
        try {
            int c = a / b;
        } catch (Exception e) {
            //捕获异常并处理
        }
    }
  1. 抛出异常
    抛出异常也分两种,一是方法内部抛出异常,二是方法上抛出异常。

使用throw关键字在方法内部抛出异常

    public static void main(String[] args) {
        String[] arr =  new String[3];
        int a = 3;
        if (a > 2){//抛出异常
            throw new ArrayIndexOutOfBoundsException();
        }else {
            String b = arr[a];
        }
    }

使用throws关键字在方法上抛出异常

public int div(int a, int b) throws Exception{
	return a/b;
}

创建自定义异常

  当Java中自带的所有异常不能满足我们的异常错误时,我们可以自定异常来处理。自定义异常时,继承Exception,使用父类的构造器。

public class MyException extends Exception{
    public MyException(){
        super();
    }
    public MyException(String msg){
        super(msg);
    }

}

例如:如果数组中赋值时,有重复元素时,抛出自定义异常。

    public static void main(String[] args) throws MyException {
        int[] arr = new int[3];
        arr[0] = 1;
        arr[1] = 2;
        int b = 1;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == b){
                throw new MyException("数组中已存在元素"+b);
            }else {
                arr[2] = b;
            }
        }
    }

在这里插入图片描述

finally关键字

finally关键字必须和try,catch一起使用,只有在try代码块得到执行的情况下,finally代码块才会得到执行。

public class test1{
    public static void main(String[] args) {
        System.out.println(test());
    }
    public static int test() {
        String[] arr = new String[1];
        System.out.println(arr[2]);
        try {
            System.out.println("执行try");
            return 0;
        } catch (Exception e) {
            System.out.println("执行catch");
            return 0;
        } finally {
            System.out.println("执行finally");
        }

    }
}

在这里插入图片描述
举个例子,上述代码中,在输出arr[2]就报错了ArrayIndexOutOfBoundsException,下标越界。try中的代码没执行,所以finally中的代码也没有执行。

public class demo {
    public static void main(String[] args) {
        int a = 1;
        System.out.println(test(a));
    }
    public static int test(int a){
        int b = 2;
        try {
            a = b;
            return a;
        } catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            System.out.println("执行finally");
            a =3;
        }
        return a;
    }
}

在这里插入图片描述

  我们看到finally语句块内的代码执行了输出,我们在finally中将a赋值为3,但是为什么返回a 确实等于2呢。
当在执行test方法时,a =b并没有发生异常,此时已经将结果存在了return语句中,本来要结束方法时,发现还有finally代码块没执行,执行finally中的代码,虽然将a赋值成3,但是return中存的结果值是2,所以返回的2。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"Faster"是一个英单词,它的意思是更快的意思。在不同的背景下,它可以有不同的解释和应用。 在日常生活中,"faster"通常表示一个行动或者动作的速度比以往更快。例如,当我们走路、跑步、开车或者骑自行车时,我们可以尝试跑得更快或者骑得更快。这个词还可以用来形容物体的移动速度,比如火车、飞机或者摩托车的速度。此外,"faster"也可以用来描述人们的反应速度、思维速度或者学习速度等。 此外,在科技和互联网领域,"faster"也具有很重要的含义。随着科技的不断进步,人们追求更快的处理速度和传输速度。例如,我们常常会听到"更快的互联网连接"、"更快的计算机处理速度"、"更快的数据传输速度"等等。这些技术进步使得信息的获取和交流变得更加高效和便捷。 然而,在追求速度的同时,我们也要权衡速度和其他因素之间的平衡。有时候,过于追求速度可能会带来其他的负面影响,比如对安全性和质量的妥协。所以在实际应用中,需要综合考虑各种因素来确定速度的优先级。 总之,"faster"是一个多功能的词,可以用来描述日常生活中的行动速度,物体的移动速度,人们的思维或者学习速度,以及科技领域的处理速度和传输速度等等。同时,我们也要在追求速度的过程中,平衡各种因素并合理使用这个词。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值