Throwable异常类简介

Throwable是所有异常的父类,Throwable的父类是Object。

Throwable的子类有两个,Error和Exception

Exception的子类有两个,RuntimeException和其他Exception

1、Error会在程序编译的时候异常,不需要去手动catch。比如,你突然写了一个 123 在程序中,不是变量也不是方法,开发工具都会提示你写的有问题,你要是硬去编译,好,Error就有了。

public class ExceptionDemo {
    public static void main(String[] args) {
        123
    }
}

运行结果

Error:(5, 9) java: 不是语句
Error:(5, 12) java: 需要';'

2、RuntimeException

运行时异常,也是不受检查的异常,所以在编译的时候不会报错,最经典的 NullPointerException,还有一些其他的比如ClassCastException、NumberFormatException、IndexOutOfBoundsException、ArrayIndexOutOfBoundsException、StringIndexOutOfBoundsException等

这种异常信息在写代码的时候不需要特意的去try catch,当然,你要是想自己抛出指定的错误码和错误描述的话得自己加上try catch。如果你不写处理的话java会自己处理抛异常,就是有点不好看

   public static void checkException() throws IOException {
        throw new IOException();
    }

    public static void unCheckException() {
        throw new NullPointerException();
    }
    public static void main(String[] args) {
        try {
            //必须try catch
            checkException();
        } catch (Exception e) {
            e.printStackTrace();
        }
        //不需要特意的去try catch
        unCheckException();
    }

3、其他Exception

其他Exception,也是受检查的异常,在写代码的时候需要自己去手动try catch的异常,不然会报错,常见的有ClassNotFoundException、IOException、FileNotFoundException等。

<think>我们正在讨论Java中的Throwable异常处理。ThrowableJava中所有错误和异常的超类。它有两个主要子类:Error和Exception。 1. Error:表示严重的系统错误,通常由JVM抛出,如OutOfMemoryError,StackOverflowError等。这些错误一般不可恢复,程序不应该尝试捕获。 2. Exception:表示程序可以捕获并处理的异常。它又分为检查型异常(checked exceptions)和非检查型异常(unchecked exceptions,即RuntimeException及其子类)。 - 检查型异常:在编译时强制检查,必须用try-catch捕获或在方法签名中声明抛出,如IOException、SQLException。 - 非检查型异常:包括运行时异常(RuntimeException)和错误(Error)。运行时异常通常由程序逻辑错误引起,如NullPointerException、IndexOutOfBoundsException,不强制要求捕获。 异常处理机制: - try:用于定义可能抛出异常的代码块。 - catch:捕获并处理特定类型的异常。 - finally:无论是否发生异常都会执行的代码块,常用于资源清理。 - throw:在方法内部抛出一个异常实例。 - throws:在方法签名中声明该方法可能抛出的异常类型。 最佳实践: - 不要捕获Throwable,因为它包括Error,而Error通常不应该被捕获。 - 避免捕获异常后不处理(空catch块)。 - 使用多重捕获(Java 7+)简化代码:catch (IOException | SQLException e)。 - 使用try-with-resources(Java 7+)自动关闭资源。 示例代码: ```java try { // 可能抛出异常的代码 FileInputStream fis = new FileInputStream("file.txt"); // 其他操作 } catch (FileNotFoundException e) { System.err.println("文件未找到: " + e.getMessage()); } catch (IOException e) { System.err.println("IO错误: " + e.getMessage()); } finally { // 通常用于关闭资源,但在try-with-resources中可能不需要显式写 // 因为try-with-resources会自动关闭资源 } ``` 从Java 7开始,可以使用try-with-resources自动关闭资源: ```java try (FileInputStream fis = new FileInputStream("file.txt")) { // 使用资源 } catch (IOException e) { // 处理异常 } ``` 自定义异常:通常继承Exception(检查型异常)或RuntimeException(非检查型异常)。 注意:捕获异常时,应先捕获子类异常,再捕获父类异常,否则子类异常会被父类的catch块捕获,导致子类catch块不可达。 §§相关问题§§ 1. Java中Error和Exception的区别是什么?各举两个例子。 2. 什么是检查型异常(checked exception)和非检查型异常(unchecked exception)?它们处理方式有何不同? 3. 在Java中,try-with-resources语句是如何工作的?它解决了什么问题? 4. 如何自定义一个异常类?应该继承哪个类? 5. 在多重catch块中,为什么需要先捕获子类异常再捕获父类异常?</think>在Java中,`Throwable` 类是所有错误(Error)和异常(Exception)的根类,位于 `java.lang` 包中。它是Java异常处理机制的核心基础,其继承关系如下: ``` Throwable ├── Error(系统级错误,通常不可恢复) │ ├── VirtualMachineError(如 OutOfMemoryError, StackOverflowError) │ └── ... └── Exception(程序可处理的异常) ├── RuntimeException(运行时异常/非受检异常) │ ├── NullPointerException │ ├── IndexOutOfBoundsException │ └── ... └── 非RuntimeException(受检异常,如 IOException, SQLException) ``` ### 核心概念解析 1. **Throwable 的构造方法**: ```java Throwable() // 无参构造 Throwable(String message) // 带错误信息 Throwable(String message, Throwable cause) // 带错误信息和原因 Throwable(Throwable cause) // 带原因 ``` 2. **关键方法**: - `getMessage()`:获取详细错误信息 - `printStackTrace()`:打印异常堆栈跟踪 - `getCause()`:返回触发当前异常的底层原因(用于异常链) - `addSuppressed(Throwable)`:添加被抑制的异常(try-with-resources 使用) 3. **异常处理机制**: - **try-catch-finally**: ```java try { // 可能抛出异常的代码 } catch (SpecificException e) { // 处理特定异常 } catch (Exception e) { // 通用异常处理 } finally { // 无论是否异常都会执行(资源清理) } ``` - **throws 声明**:在方法签名中声明可能抛出的异常 ```java public void readFile() throws IOException {...} ``` - **throw**:主动抛出异常对象 ```java if (invalid) throw new IllegalArgumentException("无效参数"); ``` 4. **异常分类**: | 类型 | 特点 | 处理要求 | 示例 | |---------------------|----------------------------------------------------------------------|----------------|--------------------------| | **Error** | JVM系统级错误,程序无法恢复 | 不需要捕获 | `OutOfMemoryError` | | **RuntimeException** | 程序逻辑错误(非受检异常) | 非强制捕获 | `NullPointerException` | | **其他Exception** | 外部因素导致的异常(受检异常) | 必须捕获或声明 | `IOException` | 5. **最佳实践**: - 优先捕获具体异常而非通用 `Exception` - 使用 try-with-resources 自动关闭资源(Java 7+): ```java try (FileInputStream fis = new FileInputStream("file.txt")) { // 自动关闭资源 } ``` - 避免空 catch 块(至少记录异常) - 通过 `getCause()` 实现异常链追踪根本原因 - 自定义异常应提供有意义的错误信息 ### 异常处理示例 ```java public class ExceptionDemo { public static void main(String[] args) { try { riskyOperation(); } catch (CustomException e) { System.err.println("捕获自定义异常: " + e.getMessage()); System.err.println("根本原因: " + e.getCause().getMessage()); } } static void riskyOperation() throws CustomException { try { // 可能抛出IOException的代码 Files.readString(Path.of("invalid.txt")); } catch (IOException e) { // 包装原始异常 throw new CustomException("文件操作失败", e); } } } // 自定义异常 class CustomException extends Exception { public CustomException(String message, Throwable cause) { super(message, cause); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值