Bootstrap

Java异常详解

怀旧网个人博客网站地址:怀旧网,博客详情:Java异常详解

一、什么是异常

Java中的异常(Exception)是程序执行过程中可能遇到的问题,它们可以由程序中的错误、逻辑问题或其他外部条件引起。异常通常分为可检查异常(Checked Exception)和运行时异常(Runtime Exception)。以下是详细介绍:

  • 可检查异常。这类异常在编译时必须被处理,否则编译器会报错。常见的可检查异常包括文件未找到、网络连接中断、输入格式错误等。这些异常通常表示程序在运行过程中可能出现的外部条件或错误。

  • 运行时异常。这类异常在程序运行过程中发生,不需要在代码中显式处理。常见的运行时异常包括空指针异常数组索引越界异常算术异常等。这些异常通常表示程序错误或逻辑错误。

在Java中,处理异常的关键字包括trycatchthrowthrows。try语句用来包围可能抛出异常的代码块,catch语句用于捕获并处理这些异常,finally语句用于执行清理操作,无论是否出现异常。throw语句用于在方法内部抛出异常对象,而throws语句用于在方法声明中声明可能抛出的异常类型。

二、异常的体系结构

异常是程序运行过程中出现的错误。本文主要讲授的是Java语言的异常处理。Java语言的异常处理框架, 是Java语言健壮性的一个重要体现。

Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。 在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exception。 Java异常体系结构呈树状,其层次结构图如图

image-20240312193737064

三、Java异常处理机制

Java的异常处理机制是Java语言的重要特性之一,它允许程序在运行时检测并处理异常情况,以保证程序的可靠性和稳定性。Java的异常处理机制主要包括以下几个方面:

  1. 异常类:Java中定义了一个Exception类和其子类,包括RuntimeException和CheckedException等。当程序出现异常情况时,将会抛出一个异常对象。

  2. 异常处理:Java提供了try-catch语句和throw语句来捕获和处理异常。try块中抛出异常后,catch块将会捕获该异常并进行处理。

  3. 异常链:Java中的异常可能会产生异常链,即一个异常由另一个异常所引发而产生。

  4. 异常处理顺序:当程序产生多个异常时,Java会按照特定的顺序处理这些异常,首先处理Exception及其子类的异常,然后再处理RuntimeException及其子类的异常。

Java的异常处理机制是一种重要的防御性编程手段,能够有效地捕获和处理程序中的异常情况,提高程序的健壮性和可靠行。

四、处理异常

当程序在运行中如果遇到不可预测的问题的时候,可以通过添加tyr-catch-finally 来进行异常检测处理:

public static void main(String[] args){
    try{
        int a = 10 / 0;
    }catch (ArithmeticException e){
        e.printStackTrace();
        System.out.println("当捕获到异常后执行的代码!");
    }finally {
        System.out.println("程序结束必须执行的代码!");
    }
    System.out.println("over!");
}

image-20240312212605701

代码执行运行结果如上,当捕获到异常就会输出catch里面的语句,然后finally的代码也会执行,而且最外边的输出也同样执行了。

当需要捕获多个异常时:

public static void a(){
    b();
}

public static void b(){
    a();
}

image-20240312212842107

我们调整代码进行异常捕获

public static void main(String[] args){
        try{
            a();
        }catch (ArithmeticException e){
            e.printStackTrace();
            System.out.println("当捕获到异常后执行的代码!");
        }finally {
            System.out.println("程序结束必须执行的代码!");
        }
        System.out.println("over!");
    }

image-20240312212928898

同样报错,添加异常捕获catch重试

public static void main(String[] args){
    try{
        a();
    }catch (ArithmeticException e){
        e.printStackTrace();
        System.out.println("当捕获到异常后执行的代码!");
    }catch (StackOverflowError e){
        e.printStackTrace();
        System.out.println("当捕获到异常后执行的代码1!");
    }finally {
        System.out.println("程序结束必须执行的代码!");
    }
    System.out.println("over!");
}

image-20240312213028310

成功捕获异常。

当遇到多个异常时:需要遵守规则-先捕获小异常在捕获大异常否则编译报错

image-20240312213159025

调整位置-可以进行编译

image-20240312213218424

五、自定义异常类

1、创建类 并且继承Exception类

public class MyException extends Exception{
}

2、编写构造方法-和记录错误的属性

public class MyException extends Exception{
    public String message;
    
    public MyException(String message) {
        this.message = message;
    }
}

3、使用-编辑测试方法-用来测试传入年龄是否合法,不合法就抛出错误

public static void test(int age) throws MyException {
    if(age < 0 || age > 200){
        throw new MyException("年龄不能小于 0 或大于 200");
    }

    System.out.println("年龄: " + age);
}

4、调用测试

public static void main(String[] args){
    try {
        test(-10);
    } catch (MyException e) {
        System.out.println(e.message);
    }
}

image-20240312213841656

public static void main(String[] args){
        try {
            test(-10);
        } catch (MyException e) {
            System.out.println(e.message);
        }
    }

image-20240312213923159

成功捕获异常---------------

六、总结

1、处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理

2、在多重catch块后面,可以加一个catch(Exception)来处理可能会被遗漏的异常

3、对于不确定的代码,也可以加上try-catch,处理潜在的异常

4、尽量去处理异常,切记只是简单的调用printStackTrace()去打印

5、具体如何处理异常,要根据不同的业务需求和异常类型去决定

6、尽量添加finally语句块去释放占用的资源

;