第5章:异常

5.1 异常概述

定义:异常是指程序执行过程中发生的意外事件,可能会导致程序中断正常流程。

异常与错误:

  • 异常(Exception):通常是可以预见和处理的问题,如文件找不到、网络连接失败等。Java中的异常分为两类:

    • 受检异常(Checked Exceptions):编译器要求必须处理的异常,如IOExceptionSQLException等。
    • 非受检异常(Unchecked Exceptions):通常是由于程序逻辑错误引起的,如NullPointerExceptionArrayIndexOutOfBoundsException等。这些异常继承自RuntimeException类,不需要强制处理。
  • 错误(Error):

  • 表示严重的系统级问题,如OutOfMemoryErrorStackOverflowError等,通常是不可恢复的,不应尝试捕获。所有的异常类都直接或间接继承自Throwable类。

  • Exception类用于用户可以恢复的异常情况。
  • 常见异常示例:ArithmeticException:除以零等算术运算错误。
  • ArrayIndexOutOfBoundsException:数组索引超出范围。
  • ClassCastException:非法类型转换。
  • IllegalArgumentException:传递给方法的参数不合法。
  • NullPointerException:试图访问空对象的成员或调用其方法。

5.2 异常处理

  • 抛出异常:

  • 使用throw关键字手动抛出一个异常对象,可以是任何实现了Throwable接口的类的实例。
  • 示例
  • if (value < 0) {
        throw new IllegalArgumentException("Value cannot be negative");
    }

    声明异常:

  • 使用throws关键字声明一个方法可能抛出的异常,告知调用者需要处理这些异常。
  • 示例
  • public void readFile(String path) throws IOException {
        // 文件读取操作
    }
    

     

    捕获异常:

  • try-catch块:

  • try语句用于包裹可能抛出异常的代码段。

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

  • 多重catch块:
  • 可以有多个catch块来处理不同类型的异常,按照从具体到一般的顺序排列,确保更具体的异常优先被捕获。

5.3 异常进阶

  • 自定义异常:

  • 创建自己的异常类,通常继承自ExceptionRuntimeException,以便更好地描述特定业务逻辑中的异常情况。
  • 示例:
  • public class InsufficientFundsException extends Exception {
        public InsufficientFundsException(String message) {
            super(message);
        }
    }
    

    方法重写中的异常:

  • 在子类中重写父类的方法时,子类方法不能抛出比父类方法更多的异常类型。
  • 子类方法可以抛出更少或相同类型的异常,或者根本不抛出异常。
  • 示例
  • class Parent {
        void method() throws IOException {
            // 方法实现
        }
    }
    
    class Child extends Parent {
        @Override
        void method() throws FileNotFoundException { // 更具体的异常
            // 方法实现
        }
    }
    

    异常链(Chained Exceptions):

  • 使用构造函数Throwable(Throwable cause)initCause(Throwable cause)方法将一个异常与另一个关联起来,有助于调试时追踪根本原因。
  • 示例:
  • try {
        // 某些可能抛出异常的操作
    } catch (IOException e) {
        throw new MyCustomException("An error occurred", e);
    }
    
    学习心得

    自定义异常使得代码更具表达力,可以更清晰地传达业务逻辑中的异常情况。方法重写中的异常规则确保了API的一致性和安全性,防止子类引入新的异常类型破坏调用者的期望

    遇到的难点及解决方法
    • 难点:理解方法重写中的异常规则,特别是如何平衡父类和子类之间的异常声明。

    • 解决方法:仔细研究Java语言规范中关于方法重写的规则,并通过实际编码练习来巩固理解。创建一些简单的继承关系,并尝试重写方法,观察编译器对异常声明的要求。

posted @ 2024-12-11 21:24  乘风破浪的小落夜  阅读(70)  评论(0)    收藏  举报