异常的使用与自定义异常

异常

  • Error

    • 开发无法进行处理的异常

    • 表示严重的错误,通常是由系统级问题导致的,对程序来说很难恢复

    • 是由 Java 虚拟机生成并抛出的,用于表示虚拟机本身遇到的问题,如内存溢出(OutOfMemoryError)、线程死锁(DeadLockError)等

    • 一般不应该被程序捕获和处理,因为这些错误通常无法修复,程序无法从中恢复

  • Exception

    • 编译时异常

      • 编译时必须进行处理的异常,需要使用 try-catch 块或声明 throws 来捕获或抛出。例如,IOException、SQLException 等

    • 运行时异常

      • 在运行时发生的异常,可以选择捕获和处理,但不强制要求。例如,NullPointerException、ArrayIndexOutOfBoundsException 等

    • 表示程序运行过程中可以捕获和处理的异常情况

      • 空指针

      • 下标越界

      • 类型转换异常

      • IO异常

    • jvm会根据产生的异常进行创建一个异常对象

      • 主函数中对异常的处理

        • 如有对于异常处理的逻辑,进行执行对应的逻辑处理

        • 如没有就将这个异常抛出调用者来处理

      • 当主函数中发现没有这个异常处理的逻辑,再次将异常抛出给jvm(jvm调用的主函数)

  • Error和Exception的区别:

    • 错误级别:Error 表示严重的问题,通常是由系统级问题导致的,程序无法恢复;而 Exception 表示程序运行过程中的异常情况,可以被处理或捕获。

    • 异常类型:Error 是 Java 虚拟机抛出的错误,一般无法恢复;Exception 分为受检查异常和非受检查异常,需要处理或捕获。

    • 异常处理:Error 通常不应该被程序捕获和处理;而 Exception 需要使用 try-catch 块或声明 throws 来进行处理。

    • 编译时要求:受检查异常在编译时要求进行处理;非受检查异常在编译时不强制要求处理

处理异常的方式

  • try...catch块( 处理异常)

    • 可以捕获并处理异常。在 try 块中编写可能会抛出异常的代码,然后使用 catch 块捕获特定类型的异常,并在 catch 块中处理异常

    try {
        // 可能抛出异常的代码
    } catch (ExceptionType1 e1) {
        // 处理 ExceptionType1 类型的异常
    } catch (ExceptionType2 e2) {
        // 处理 ExceptionType2 类型的异常
    } finally {
        // 可选,无论是否捕获到异常都会执行的代码块
    }
  • throws 声明 (抛出异常)

    • 在方法声明中指定该方法可能抛出的异常。通过这种方式,可以将异常的处理责任交给调用方法的调用者,而不在当前方法中处理异常

    public void method() throws ExceptionType {
        // 可能抛出异常的代码
    }
    // 调用 method() 方法时需要处理或继续抛出异常
  • finally块

    • 是一个可选的代码块,用于包含无论是否发生异常都需要执行的代码。无论异常是否被捕获,finally 块中的代码都会执行

    try {
        // 可能抛出异常的代码
    } catch (Exception e) {
        // 处理异常
    } finally {
        // 无论是否捕获到异常都会执行的代码块,进行资源的释放或清理操作
    }
  • 注意:

    • 在开发中进行编写接口的时候,有异常一定要抛

    • 在多个catch中,第一个catch处理异常必须是第二个catch的子类或者是兄弟类,不是父类,第二个和第三个以此类推。

  • finally final finalize 之间的区别

    1. finally

      • 是一个关键字,用于定义在异常处理中的一个代码块。

      • 通常用于包含无论是否发生异常都需要执行的代码。不管是否有异常被捕获,finally 块中的代码都会执行。

      • 通常用于进行资源的释放、关闭数据库连接等清理操作,以确保资源得到正确处理。

      • 可以和 try-catchtry-catch-finally 结构一起使用。

    2. final

      • 是一个关键字,可以用于修饰类、方法和变量。

      • 修饰类:final class 表示该类是最终类,不能被继承。

      • 修饰方法:final 方法表示该方法是最终方法,不能被子类重写。

      • 修饰变量:final 变量表示该变量是一个常量,只能被赋值一次。一旦赋值后,就不能再次修改。

    3. finalize

      • finalize 是一个方法,是由垃圾回收器在对象被回收之前调用的。垃圾回收器负责在适当的时机自动回收未引用的对象。

      • 允许对象在被销毁之前进行资源释放、清理或其他必要的操作。

      • 通常情况下,应该避免使用 finalize 方法,因为它无法保证被正确地调用和执行,而且会对性能产生一定的负面影响。

    总结:

    • finally 是一个关键字,用于定义在异常处理中的代码块,确保其中的代码无论是否发生异常都得到执行。

    • final 是一个关键字,可以用于修饰类、方法和变量,分别表示最终类、最终方法和常量。

    • finalize 是一个方法,垃圾回收器在对象被回收之前调用它,允许对象进行资源释放或清理操作,但不推荐使用

自定义异常

可以根据具体需求自定义异常类,并使用 throw 关键字抛出自定义异常。通过自定义异常可以更好地表示特定的错误情况,并进行相应的处理。自定义异常类通常继承于 Exception 类或其子类

public class CustomException extends Exception {
    // 自定义异常类的代码和逻辑
}
throw new CustomException("自定义异常信息");
  • 创建自定义异常类的通常步骤:

    1. 创建自定义异常类:

      • 自定义异常类应该命名以 Exception 结尾,以明确其是一个异常类。

      • 自定义异常类通常继承 Exception 类或其子类,但也可以直接继承其他异常类,如 RuntimeException

      • 在自定义异常类中,可以添加构造方法、自定义属性和方法,以及其他适用的逻辑。

    public class CustomException extends Exception {
        // 自定义异常类的代码和逻辑
    ​
        public CustomException() {
            super(); // 调用父类构造方法
        }
    ​
        public CustomException(String message) {
            super(message); // 调用父类构造方法,并传入异常信息
        }
    ​
        // 重写其他父类的方法,增加自定义的逻辑
    }
    ​
    1. 使用自定义异常类:

      • 在程序的适当位置,可以抛出自定义异常,表示特定的错误或异常情况。

      • 可以使用 throw 关键字抛出自定义异常对象,并在适当的地方捕获和处理该异常。

    public void someMethod() throws CustomException {
        // 某些逻辑判断
        if (条件) {
            throw new CustomException("自定义异常信息");
        }
    }
    1. 处理自定义异常:

      • 在调用可能抛出自定义异常的方法时,可以使用 try-catch 块来捕获和处理异常。

      • catch 块中,根据自定义异常类型进行相应的处理操作。

    try {
        someMethod();
    } catch (CustomException e) {
        // 自定义异常处理逻辑
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

鱼粮爱编程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值