try、catch、finally、throw、throws 的用法,finally 块一定会执行吗?举反例说明。

简介: Java异常处理核心关键字包括try、catch、finally、throw、throws。try捕获异常,catch处理异常,finally确保代码执行(通常用于资源释放),throw手动抛出异常,throws声明可能的异常类型。finally块在大多数情况下都会执行,但若JVM终止或线程被强制中断,则可能不执行。

在 Java 中,trycatchfinallythrowthrows 是异常处理的核心关键字,各自有明确的用途,具体用法和 finally 块的执行情况如下:

一、关键字用法

  1. try
    用于包裹可能发生异常的代码块,是异常处理的起点。try 块必须与 catchfinally 结合使用(至少出现一个)。
    示例:

    try {
         
        // 可能抛出异常的代码(如文件操作、类型转换等)
        int result = 10 / 0;
    } catch (ArithmeticException e) {
         
        // 处理异常
    }
    
  2. catch
    用于捕获并处理 try 块中抛出的异常,紧跟在 try 之后。可以有多个 catch 块处理不同类型的异常(子类异常需放在父类异常前)。
    示例:

    try {
         
        // 可能抛出异常的代码
    } catch (NullPointerException e) {
         
        System.out.println("空指针异常");
    } catch (IndexOutOfBoundsException e) {
         
        System.out.println("索引越界异常");
    }
    
  3. finally
    用于定义无论是否发生异常都需要执行的代码(如资源释放),紧跟在 catch 块之后(若没有 catch,则直接跟在 try 后)。
    示例:

    FileReader fr = null;
    try {
         
        fr = new FileReader("file.txt");
    } catch (FileNotFoundException e) {
         
        e.printStackTrace();
    } finally {
         
        // 确保资源关闭
        if (fr != null) {
         
            try {
         
                fr.close();
            } catch (IOException e) {
         
                e.printStackTrace();
            }
        }
    }
    
  4. throw
    用于在方法内部主动抛出一个具体的异常对象(手动触发异常)。
    示例:

    public void checkAge(int age) {
         
        if (age < 0) {
         
            // 主动抛出非法参数异常
            throw new IllegalArgumentException("年龄不能为负数");
        }
    }
    
  5. throws
    用于在方法声明处声明该方法可能抛出的异常类型(告知调用者需处理这些异常),多个异常用逗号分隔。
    示例:

    // 声明方法可能抛出 IO 异常
    public void readFile() throws IOException {
         
        FileReader fr = new FileReader("file.txt");
        fr.close();
    }
    

二、finally 块一定会执行吗?

不一定finally 块的执行依赖于 JVM 正常运行,若在 trycatch 块中发生导致 JVM 终止的操作,finally 块将不执行。

反例 1:System.exit(0) 终止 JVM

try {
   
    System.out.println("try 块执行");
    System.exit(0); // 终止 JVM
} catch (Exception e) {
   
    e.printStackTrace();
} finally {
   
    System.out.println("finally 块执行"); // 不会执行
}

说明System.exit(0) 会直接终止当前 JVM 进程,程序停止运行,finally 块无法执行。

反例 2:线程被强制终止

public static void main(String[] args) {
   
    Thread t = new Thread(() -> {
   
        try {
   
            System.out.println("线程 try 块");
            Thread.sleep(1000); // 模拟耗时操作
        } catch (InterruptedException e) {
   
            e.printStackTrace();
        } finally {
   
            System.out.println("线程 finally 块"); // 可能不执行
        }
    });
    t.start();
    t.interrupt(); // 中断线程(若在 finally 执行前生效)
    // 极端情况:调用 t.stop()(已过时,但强制终止线程时 finally 可能不执行)
}

说明:若线程在 finally 块执行前被强制终止(如 stop() 方法,或中断导致无法继续执行),finally 块可能不执行。

其他特殊情况

  • 虚拟机崩溃(如内存溢出 OutOfMemoryError 导致 JVM 异常终止)。
  • 硬件故障(如断电、CPU 故障)。

这些情况都会导致程序无法继续运行,finally 块自然不会执行。

总结

  • try/catch/finally 用于捕获和处理异常,throw 手动抛异常,throws 声明方法可能抛的异常。
  • finally大多数情况会执行(如正常流程、异常被捕获、return/break 等),但在 JVM 终止或线程被强制终止等极端情况下不执行
目录
相关文章
|
7月前
|
NoSQL Java 网络安全
SpringBoot启动时连接Redis报错:ERR This instance has cluster support disabled - 如何解决?
通过以上步骤一般可以解决由于配置不匹配造成的连接错误。在调试问题时,一定要确保服务端和客户端的Redis配置保持同步一致。这能够确保SpringBoot应用顺利连接到正确配置的Redis服务,无论是单机模式还是集群模式。
626 5
|
9月前
|
Java 数据库 C++
Java异常处理机制:try-catch、throws与自定义异常
本文深入解析Java异常处理机制,涵盖异常分类、try-catch-finally使用、throw与throws区别、自定义异常及最佳实践,助你写出更健壮、清晰的代码,提升Java编程能力。
|
9月前
|
存储 编解码 API
如何利用阿里云OSS进行图片和视频处理?
本文介绍了如何利用阿里云对象存储OSS进行图片和视频处理。内容包括OSS的基本功能、上传与管理媒体资源、图片处理(缩放、裁剪、旋转、水印等)、视频处理(转码、截图、拼接等)以及相关API的使用方法。通过OSS,用户可高效实现多媒体资源的存储与处理,适用于各类企业和开发者。
|
搜索推荐 Java 开发者
org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException 问题处理
【5月更文挑战第14天】org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException 问题处理
5926 1
yum 可以安装rpm包
【6月更文挑战第18天】yum 可以安装rpm包
1492 0
|
关系型数据库 MySQL Java
Failed to configure a DataSource: ‘url‘ attribute is not specified and no embedded datasource could
解决方法: 配置H2数据库或者MySQL数据库,其中配置MySQL解决方法如下: 1、添加 MySQL连接驱动的依赖 Maven工程在pom.xml中添加
3369 0
|
NoSQL Redis
RedisTemplate.opsForHash()用法简介并举例
RedisTemplate.opsForHash()用法简介并举例
2359 1
|
缓存 安全 Java
Java中 final、finally、finalize 有什么区别?
本文详细阐述了Java中`final`、`finally`和`finalize`的区别:`final`用于修饰类、方法和变量以表示不可变性;`finally`是用于确保在`try-catch`结构中无论是否发生异常都能执行的代码块;而`finalize`是`Object`类的方法,用于在对象被垃圾回收前执行清理工作,但在JDK 9中已被标记为弃用。
694 0
Java中 final、finally、finalize 有什么区别?
try catch finally,try 里面有 return,finally 还执行吗?
try catch finally,try 里面有 return,finally 还执行吗?
334 0
|
开发工具 对象存储 git