• Java高级应用——异常处理


    异常处理

    概念

    异常处理是在程序执行过程中遇到错误或异常情况时的一种机制,它允许程序在错误发生时进行适当的处理,而不会导致程序崩溃或产生不可预测的结果。

    1. 异常类型:
      • 受检异常(Checked Exception):这些异常在编译时强制要求进行处理,例如IOException、SQLException等。程序必须使用try-catch块或throws语句显式处理这些异常。
      • 非受检异常(Unchecked Exception):也称为运行时异常(Runtime Exception),这些异常在编译时不强制要求进行处理,例如NullPointerException、ArrayIndexOutOfBoundsException等。程序可以选择处理或不处理这些异常。
    2. 异常处理机制:
      • try-catch语句块:使用try块包含可能引发异常的代码,并使用catch块捕获并处理特定类型的异常。如果try块中的异常与catch块中指定的异常类型匹配,那么相应的catch块将被执行。
      • finally块:无论是否发生异常,finally块中的代码始终会被执行。通常用于资源的释放,如关闭文件、数据库连接等。
      • throws关键字:在方法声明中使用throws关键字可以将异常抛出给调用者处理。如果一个方法可能抛出受检异常,但方法本身不处理该异常,可以使用throws关键字将其传递给上层调用者处理。
    3. 异常处理流程:
      • 当在try块中发生异常时,程序将立即跳转到与异常类型匹配的catch块。
      • 如果找不到匹配的catch块,异常将传递给调用者的上层方法,直至找到合适的catch块或达到程序的顶层(如main方法)。
      • 如果异常没有被处理,程序将终止并打印异常信息。
    4. 嵌套的try-catch块:
      • 可以在一个try块中嵌套另一个try-catch块,用于处理更细粒度的异常情况。
      • 内层的catch块先捕获并处理异常,如果没有匹配的catch块,则将异常传递给外层的catch块继续处理。
    5. 自定义异常:
      • 可以通过扩展Exception类或其子类来创建自定义异常类。
      • 自定义异常类可以添加额外的属性和方法,以满足特定的异常需求。
    6. 异常处理最佳实践:
      • 针对不同类型的异常进行具体的处理,避免使用过于宽泛的异常捕获。
      • 在catch块中记录异常信息,以便进行错误分析和调试。
      • 在finally块中释放资源,确保资源得到正确的处理。
      • 适当地使用throws关键字将异常传递给调用者,避免过度捕获异常。

    Java异常体系

    Java异常体系是Java编程语言中用于处理错误和异常情况的层次结构。它是基于类的,并且所有的异常类都是从java.lang.Throwable类派生的。

    1. java.lang.Throwable

      • Throwable是Java异常体系的根类,它是所有异常类的基类。
      • Throwable有两个子类:ErrorException

      Error 和 Exception

    2. java.lang.Error

      • Error表示严重的系统级错误,通常由虚拟机引发。
      • Error及其子类一般不被程序员捕获和处理,因为这些错误通常表示无法恢复的情况,如OutOfMemoryErrorStackOverflowError等。
    3. java.lang.Exception

      • Exception是所有非严重错误和异常的基类。
      • Exception分为两种类型:受检异常(Checked Exception)和非受检异常(Unchecked Exception)。

      编译时异常和运行时异常

    4. 受检异常(Checked Exception):

      • 受检异常是在编译时强制要求进行处理的异常,以便程序能够在异常发生时进行适当的处理。
      • 受检异常是Exception类的子类,但不是RuntimeException的子类。
      • 例如:IOExceptionSQLException等。
    5. 非受检异常(Unchecked Exception):

      • 非受检异常是在编译时不强制要求进行处理的异常,通常是由程序逻辑错误或运行时错误引发的。
      • 非受检异常是RuntimeException类及其子类的实例。
      • 例如:NullPointerExceptionArrayIndexOutOfBoundsException等。

      在这里插入图片描述


      Java异常处理的方式

    6. 异常处理的关键字:

      • try:用于包含可能引发异常的代码块。
      • catch:用于捕获并处理特定类型的异常。
      • finally:用于定义在无论是否发生异常时都会执行的代码块。
      • throws:用于在方法声明中指定可能抛出的异常。
    7. Java异常处理提供了多种方式来捕获、处理和传递异常。下面是Java异常处理的详细细节:

      1. try-catch块:

        • try-catch块用于捕获和处理异常。

        • try块包含可能引发异常的代码。

        • catch块用于捕获并处理特定类型的异常。

        • 语法:

          try {
              // 可能引发异常的代码
          } catch (ExceptionType1 e1) {
              // 处理 ExceptionType1 类型的异常
          } catch (ExceptionType2 e2) {
              // 处理 ExceptionType2 类型的异常
          } finally {
              // finally 块中的代码无论是否发生异常都会执行
          }
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
        • catch块可以有多个,用于捕获不同类型的异常。

        • finally块中的代码无论是否发生异常都会执行,通常用于释放资源或进行清理操作。

      2. 异常传递:

        • 当在当前方法中无法处理异常时,可以将异常传递给上层调用方法处理。

        • 使用throws关键字在方法声明中指定可能抛出的异常。

        • 调用方法可以继续传递异常,或在其内部使用try-catch块捕获和处理异常。

        • 语法:

          void method1() throws ExceptionType1, ExceptionType2 {
              // 方法可能抛出的异常
          }
          
          void method2() throws ExceptionType1, ExceptionType2 {
              method1(); // 异常传递给调用方法处理
          }
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
      3. finally块:

        • finally块中的代码无论是否发生异常都会执行。
        • finally块通常用于释放资源、关闭文件、断开连接等清理操作,以确保代码执行完毕后资源得到正确释放。
        • 无论异常是否被捕获和处理,finally块中的代码都会被执行。
      4. throw语句:

        • throw语句用于显式地抛出异常。

        • 可以使用throw语句在任何地方抛出异常,包括方法中、catch块中或finally块中。

        • 语法:

          throw exception;
          
          • 1
        • throw语句通常用于在某些条件下抛出特定类型的异常,以使程序进入异常状态。

      5. 自定义异常:

        • 可以通过扩展Exception类或其子类来创建自定义异常类。
        • 自定义异常类可以根据特定的应用程序需求添加额外的属性和方法。
        • 可以在代码中抛出自定义异常并使用try-catch块进行捕获和处理。

    在这里插入图片描述

  • 相关阅读:
    Redis 持久化
    页面多查询条件必选的统一处理思路
    软件测试工程师面试题汇总
    MHA高可用配置及故障切换
    重读《纳瓦尔宝典》精彩语录及感悟篇(三)
    nginx解决静态页面中ajax跨域方案配置
    16. 最接近的三数之和
    远程办公时意外摔伤,算工伤吗?
    Java经典问题解答(9题)
    【NLP练习】调用Gensim库训练Word2Vec模型
  • 原文地址:https://blog.csdn.net/Zdethm/article/details/133323840