对于异常类的理解

101 阅读4分钟

在 Java 中,异常类是用于表示异常情况的类。Java 的异常体系是基于类的继承机制构建的,所有的异常类都是 Throwable 类的子类。Throwable 分为两个主要的子类:ErrorException

1. Error 类(虚拟机本身):

Error 类用于表示严重的错误,通常是虚拟机无法处理的错误。程序员通常不需要直接捕获或处理 Error 类的对象,因为这些错误通常表示虚拟机本身的问题,而不是程序的错误。 这些错误通常是致命的,程序无法继续正常执行。

常见的 Error 类包括:

  • OutOfMemoryError: 表示虚拟机耗尽了内存资源。
  • StackOverflowError: 表示调用栈溢出,通常是由于递归调用层次太深。

2. Exception 类(程序):

Exception 类是所有异常的基类,它包括了大多数由程序员引起的异常。Exception 分为两类:受检异常(Checked Exceptions)不受检异常(Unchecked Exceptions)

  • 受检异常(Checked Exceptions):

    • 继承自 Exception,但不是 RuntimeException 的子类。
    • 在编译时由编译器强制检查,程序员需要明确处理或声明抛出这类异常。
  • 不受检异常(Unchecked Exceptions):

    • 继承自 RuntimeException
    • 通常是由程序错误引起的异常,无需在代码中明确处理或声明抛出。

3. RuntimeException 类:

RuntimeException 类是所有不受检异常的父类。这类异常通常是由程序员的错误导致的,而不是外部环境或输入数据的错误。

常见的 RuntimeException 类包括:

  • NullPointerException: 尝试调用对象的方法或访问对象的字段,而该对象为 null
  • ArrayIndexOutOfBoundsException: 数组索引越界。
  • ArithmeticException: 算术运算异常,如除以零。

4. 自定义异常:

除了系统定义的异常类,Java 还支持用户自定义异常类。自定义异常类通常继承自 Exception 或其子类,并可以根据应用程序的需求添加额外的字段和方法。

public class CustomException extends Exception {
    // 可以添加自定义的字段和方法
    // ...
}

自定义异常的目的是让程序员能够更好地理解和处理程序中的特定问题,同时提高代码的可读性和维护性。在实际开发中,通常在需要表示特定错误情况时才会定义自定义异常。

异常日志

e.getMessage()、e.printStackTrace()、e.toString()

e.toString()获取的信息包括异常类型和异常详细消息,同时写入error.log。 在 Java 中,不同类型的异常在其 getMessage() 方法返回的日志信息上会有一些差异。这取决于异常的具体实现和设计。以下是一些常见异常的 getMessage() 日志可能的情况:

  1. NullPointerException(空指针异常):

    • 如果是系统抛出的空指针异常,通常 getMessage() 返回 null
    • 如果是自定义的空指针异常,可能在构造异常时传递了一些描述信息,这些信息会被 getMessage() 返回。
  2. ArrayIndexOutOfBoundsException(数组越界异常):

    • 通常 getMessage() 返回数组越界的详细信息,例如:"Index 5 out of bounds for length 3"。
  3. ArithmeticException(算术异常,如除零异常):

    • 通常 getMessage() 返回与具体算术异常相关的信息,例如:"/ by zero"。
  4. FileNotFoundException(文件未找到异常):

    • 如果是由 Java 标准库的 FileInputStreamFileReader 抛出的异常,通常 getMessage() 返回文件路径或文件名。
    • 如果是自定义的异常,可能在构造异常时传递了文件信息,这些信息会被 getMessage() 返回。
  5. IOException(输入/输出异常):

    • 通常 getMessage() 返回 I/O 相关的详细信息,例如:"Connection refused" 或 "File not found".

需要注意的是,对于一些 Java 标准库中定义的异常,它们的 getMessage() 返回的信息通常是为了提供对异常原因的简单描述,而不是为了提供详细的上下文信息。在实际的生产环境中,更推荐使用完整的异常堆栈信息,例如使用 e.printStackTrace() 或其他日志框架的记录异常功能,以便更全面地了解异常的发生原因。

  • e.toString()获取的信息包括异常类型和异常详细消息,同时写入error.log

  • e.getMessage()只是获取了异常的详细消息字符串,同时写入error.log

  • e.printStackTrace();可以打印出异常信息在代码中的信息以及位置到控制台,能够非常清晰的定位问题,但是不能写入error.log文件,可以手动写代码将其写入error.log文件

直接打印 e和e.printStackTrace() 是一样的日志打印效果,但是能写入error.log文件