2024年150道高频Java面试题(六)

11. Java 中的异常处理机制是如何工作的?

Java 中的异常处理机制是一种用于处理程序执行期间发生的不正常情况的方法,这些情况可能是由于外部错误、API使用不当或内部错误逻辑等原因引起的。Java 的异常处理通过五个关键字来工作:trycatchfinallythrowthrows

  1. try 块 :它用来包围可能会抛出异常的代码。如果在 try 块中的代码抛出了异常,则会立即跳过 try 块中剩余的代码,转去查找匹配的 catch 块。

  2. catch 块 :用于捕获 try 块中抛出的异常。它可以指定要捕获的异常类型,多个 catch 块可以捕获不同类型的异常。当一个异常被抛出时,Java 虚拟机将按顺序检查每个 catch 块,直到找到匹配的异常类型。

    java 复制代码
    try {
        // 可能会抛出异常的代码
    } catch (SpecificException e) {
        // 处理特定异常
    } catch (Exception e) {
        // 处理其他所有异常
    }
  3. finally 块 :无论 try 块中的代码是否抛出异常,以及是否被捕获,finally 块中的代码总是会被执行。通常,它用来释放资源或者执行一些清理工作。

  4. throw 关键字:用于显式地抛出一个异常。

    java 复制代码
    if (errorCondition) {
        throw new ExceptionType("Error message");
    }
  5. throws 子句:用在方法签名中,以声明该方法可能会抛出的异常。

    java 复制代码
    public void myMethod() throws ExceptionType {
        // 方法代码
    }

工作流程

  1. 当 Java 程序执行到 try 块中的代码时,它会正常执行,除非遇到一个会抛出异常的情况。
  2. 一旦检测到一个异常,当前执行的操作会被立即停止,控制流转至第一个匹配该异常类型的 catch 块。
  3. 如果 catch 块处理了异常,程序可以继续执行 finally 块(如果有的话),然后继续执行 try-catch-finally 结构之外的代码。
  4. 如果异常没有被处理(即没有匹配的 catch 块),则该异常会沿着调用栈向上传递,直到找到可以处理它的 catch 块或者导致程序终止。

注意事项

  • 不要把不应该抛出异常的代码放在 finally 块中,这可能会导致其他异常隐藏了原始异常。
  • 不要使用异常处理作为常规流程控制的手段,异常处理机制主要用于处理不正常或罕见的情况。

通过这样的机制,Java 提供了一种结构化和统一的方式来处理错误和异常情况,有助于编写健壮和可维护的代码。

12. try-catch-finally 块中的 finally 一定会执行吗?

finally 块在大多数情况下是会执行的,但是有一种情况它不会被执行,那就是当虚拟机在执行 try-catch 块中的代码时遇到某些严重的错误或异常导致虚拟机即将退出时。以下是不会执行 finally 块的几种场景:

  1. 虚拟机退出 :如果虚拟机在执行 try 块或者 catch 块中的代码时遇到不可恢复的错误,比如 System.exit(int status) 被调用,那么 finally 块将不会被执行。
  2. 操作系统级别中断 :如果操作系统的中断,比如强制关机,那么 finally 块可能来不及执行。

以下是一个代码示例说明 finally 块通常情况下总是执行:

java 复制代码
public class FinallyExample {
    public static void main(String[] args) {
        try {
            // 业务逻辑代码
            System.out.println("Inside try block");
            // 强制抛出异常
            throw new RuntimeException("Exception from try block");
        } catch (Exception e) {
            // 异常处理逻辑
            System.out.println("Inside catch block: " + e.getMessage());
        } finally {
            // 清理资源或执行一些必要操作
            System.out.println("Inside finally block");
        }
        // 继续执行
        System.out.println("After try-catch-finally");
    }
}

在上面的代码中,无论是否抛出异常,finally 块中的代码都会被执行。

总结来说,除了上述的特殊情况,finally 块在以下情况下都会执行:

  • try 块中的代码正常完成。
  • try 块中的代码抛出异常,被 catch 块处理。
  • try 块中的代码抛出异常,没有被任何 catch 块处理,但程序仍能继续执行。
  • 在 try 或 catch 块中执行了 returncontinuebreak 等跳转语句,finally 也会在跳转之前执行。

finally 块通常用来释放资源,比如关闭文件流或者数据库连接,确保这些资源能够被正确释放,避免造成资源泄露。

相关推荐
晴殇i1 小时前
揭秘JavaScript中那些“不冒泡”的DOM事件
前端·javascript·面试
孟陬2 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端
想用offer打牌2 小时前
一站式了解四种限流算法
java·后端·go
绝无仅有2 小时前
Redis过期删除与内存淘汰策略详解
后端·面试·架构
绝无仅有2 小时前
Redis大Key问题排查与解决方案全解析
后端·面试·架构
华仔啊2 小时前
Java 开发千万别给布尔变量加 is 前缀!很容易背锅
java
AAA梅狸猫3 小时前
Looper.loop() 循环机制
面试
AAA梅狸猫3 小时前
Handler基本概念
面试
也些宝3 小时前
Java单例模式:饿汉、懒汉、DCL三种实现及最佳实践
java