一篇文章带你搞定 Java 中异常的基本概念

在 Java 中程序的错误主要是语法错误和语义错误,一个程序即使在编译时没有错误信息产生,在运行时也有可能出现各种各样的错误导致程序退出,这些错误在 Java 中称为异常
在这里插入图片描述

一、异常的基本概念

Java 的异常处理机制具有易于使用,可自行定义异常类,处理抛出的异常同时又不会降低程序运行的速度等优点。因而在 Java 程序设计时,应充分地利用 Java 的异常处理机制,以增进程序的稳定性及效率。

public class Test{
    public static void main(String[] args) {
        System.out.println("**************** 计算开始 ****************");
        int i = 10;
        int j = 0;
        int temp = i/j;//此处会产生异常
        System.out.println("两个数字相除结果:" + temp);
        System.out.println("**************** 计算结束 ****************");
    }
}

在这里插入图片描述
此处因为被除数为 0 ,所以程序出现了异常,由运行结果可以看出,不对异常进行处理,一旦出现异常,程序就立刻退出,后面的两条语句也就没法打印输出

在这里插入图片描述

二、在程序中使用异常处理

异常处理语句的格式:

try{
	//有可能出现异常的语句
}catch(异常类 异常对象){
	//编写异常的处理语句
}[catch(异常类 异常对象){
} ... ]
[finally{
	一定会运行到的程序代码;
}]

格式中,会在 try 语句之中捕获可能出现的异常代码,如果在 try 中产生了异常,则程序会自动跳转到 catch 语句中找到匹配的异常类型进行相应的处理。

最后不管程序是否会产生异常,肯定都会执行到 finally 语句,finally 语句就作为异常的统一出口。
其实,finally 块是可以省略的,如果省略了 finally 块,则在 catch() 块运行结束后,程序会跳到 try-catch 块之后继续执行。
在这里插入图片描述

public class Test{
    public static void main(String[] args) {
        System.out.println("******** 计算开始 ********");
        int i =10;
        int j = 0;
        try {
            int temp = i/j;
            System.out.println("相除结果:" + temp);
        }catch (ArithmeticException e){//捕捉算术异常
            System.out.println("出现异常了:" + e);//出现异常执行异常处理语句
        }finally {//异常的处理语句
            System.out.println("******** 计算结束 ********");
        }
    }
}

在这里插入图片描述
捕获多个异常示例:

public class Test{
    public static void main(String[] args) {
        System.out.println("******** 计算开始 ********");
        int i = 0;
        int j = 0;
        try {
            String str1 = args[0];
            String str2 = args[1];
            i = Integer.parseInt(str1);//将第一个参数由字符串变为整型
            j = Integer.parseInt(str2);//将第二个参数由字符串变为整型
            int temp = i/j;
            System.out.println("相除结果:" + temp);
        }catch (ArithmeticException e){//捕捉算术异常
            System.out.println("出现异常了:" + e);//出现异常执行异常处理语句
        }catch (NumberFormatException e){
            System.out.println("数字转换异常:" + e);//处理数字格式化异常
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println("数组越界异常:" + e);//处理数组越界
        } finally {
            System.out.println("******** 计算结束 ********");
        }
    }
}

三、异常类的继承结构

在整个Java的异常结构中,实际上有两个最常用的类,分别为 Exception 和 Error,这两个类都是 Throwable 的子类。
在这里插入图片描述

  • Exception:一般表示的是程序中出现的问题,可以直接使用 try…catch 处理
  • Error:一般指的是 JVM 错误,程序中无法处理

一般情况下,开发中习惯于将 Exception 和 Error 统称为异常,而算术异常、数字格式化异常等都属于 Exception 的子类

在catch 语句输出异常时,处理可以直接使用System.out.println(异常对象)的方式打印异常信息外,有时也会直接使用 Exception 类中的 printStackTrace() 方法输出异常信息

e.printStackTrace();
//使用这种方式打印的异常信息是最完整的

四、Java 的异常处理机制

在整个 Java 的异常处理中,实际上也是按照面向对象的方式进行处理的:
(1)一旦产生异常,则首先会产生一个异常类的实例化对象
(2)在 try 语句中对此异常对象进行捕捉
(3)产生的异常对象与 catch 语句中的各个异常类型进行匹配,如果匹配成功,则执行catch 语句中的代码
在这里插入图片描述
由之前的对象多态性可知,所有的子类实例可以全部使用父类接收,因此可以利用向上转型,让所有的异常对象都使用 Exception 接收。

public class Test{
    public static void main(String[] args) {
        System.out.println("******** 计算开始 ********");
        int i = 0;
        int j = 0;
        try {
            String str1 = args[0];
            String str2 = args[1];
            i = Integer.parseInt(str1);//将第一个参数由字符串变为整型
            j = Integer.parseInt(str2);//将第二个参数由字符串变为整型
            int temp = i/j;
            System.out.println("相除结果:" + temp);
        }catch (ArithmeticException e){//捕捉算术异常
            System.out.println("出现异常了:" + e);//出现异常执行异常处理语句
        }catch (NumberFormatException e){
            System.out.println("数字转换异常:" + e);//处理数字格式化异常
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println("数组越界异常:" + e);//处理数组越界
        }catch (Exception e){
            System.out.println("其他异常:" + e);//处理其他异常
        }
        System.out.println("******** 计算结束 ********");
    }
}

程序最后直接使用 Exception 进行其他异常的捕获,则本程序出现的全部异常就都可以处理了,需要注意在 Java 中所有捕获范围小的异常必须放在捕获大的异常之前,否则程序在编译时就会出现错误提示

五、关于Throwable 和 Exception

代码中也可以使用 Throwable 捕获异常,因为Throwable捕获的范围是最大的。

但是一般开发中是不会直接使用 Throwable 进行捕获的,对于 Throwable 来说有 Exception、Error 两个子类,Error 类本身不需要程序处理,而程序中需要处理的只是 Exception,所以没有必要使用 Throwable

同时对于一个程序来说,如果有多个异常最好分别进行捕获,而不要直接使用 Exception 捕获全部异常

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南淮北安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值