关键词搜索

源码搜索 ×
×

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

发布2020-01-14浏览561次

详情内容

在 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{
    	一定会运行到的程序代码;
    }]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    格式中,会在 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("******** 计算结束 ********");
            }
        }
    }
    
      11
    • 12
    • 13
    • 14
    • 15

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

    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("******** 计算结束 ********");
            }
        }
    }
    
      11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    三、异常类的继承结构

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

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

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

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

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

    四、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("******** 计算结束 ********");
        }
    }
    
      11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

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

    五、关于Throwable 和 Exception

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

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

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

    相关技术文章

    点击QQ咨询
    开通会员
    返回顶部
    ×
    微信扫码支付
    微信扫码支付
    确定支付下载
    请使用微信描二维码支付
    ×

    提示信息

    ×

    选择支付方式

    • 微信支付
    • 支付宝付款
    确定支付下载