当前位置:首页 > Java

java异常如何处理

2026-02-04 22:07:15Java

异常处理的基本概念

Java异常分为检查型异常(Checked Exception)非检查型异常(Unchecked Exception)。检查型异常需在编译时处理(如IOException),非检查型异常包括运行时异常(如NullPointerException)和错误(如OutOfMemoryError)。

try-catch-finally 块

通过try捕获可能抛出异常的代码,catch处理特定异常,finally确保资源释放(无论是否发生异常):

try {
    // 可能抛出异常的代码
    FileInputStream file = new FileInputStream("test.txt");
} catch (FileNotFoundException e) {
    // 处理文件未找到异常
    System.err.println("文件未找到: " + e.getMessage());
} finally {
    // 关闭资源
    if (file != null) {
        file.close();
    }
}

多重 catch 块

按异常子类到父类的顺序捕获多个异常:

try {
    int[] arr = {1, 2};
    System.out.println(arr[3]); // 抛出ArrayIndexOutOfBoundsException
} catch (ArrayIndexOutOfBoundsException e) {
    System.err.println("数组越界: " + e);
} catch (Exception e) {
    System.err.println("通用异常处理: " + e);
}

throws 声明异常

在方法签名中使用throws将异常抛给调用者处理:

public void readFile() throws IOException {
    FileReader reader = new FileReader("file.txt");
    // 其他操作
}

throw 手动抛出异常

通过throw主动抛出异常对象:

if (input < 0) {
    throw new IllegalArgumentException("输入不能为负数");
}

自定义异常

继承ExceptionRuntimeException创建自定义异常:

public class CustomException extends Exception {
    public CustomException(String message) {
        super(message);
    }
}

// 使用示例
try {
    throw new CustomException("自定义异常");
} catch (CustomException e) {
    System.err.println(e.getMessage());
}

try-with-resources

自动管理资源(需实现AutoCloseable接口):

try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    System.err.println("IO异常: " + e);
}

异常链与 cause

通过initCause()或构造方法传递原始异常:

try {
    // 模拟原始异常
    throw new NullPointerException("原始异常");
} catch (NullPointerException e) {
    IllegalArgumentException ex = new IllegalArgumentException("包装异常");
    ex.initCause(e);
    throw ex;
}

最佳实践

  1. 精准捕获:避免直接捕获Exception,优先处理具体异常类型。
  2. 资源释放:使用try-with-resourcesfinally确保资源关闭。
  3. 日志记录:通过日志工具(如SLF4J)记录异常详情。
  4. 避免空捕获catch块中至少记录异常信息。
  5. 自定义异常:为业务逻辑定义清晰的异常类型。

示例日志记录:

catch (IOException e) {
    logger.error("文件操作失败", e);
    throw new BusinessException("业务处理失败", e);
}

java异常如何处理

分享给朋友:

相关文章

react如何处理异常

react如何处理异常

React 异常处理的基本方法 React 应用中异常处理通常分为组件内错误和全局错误两类。组件内错误可通过 try/catch 或错误边界(Error Boundaries)捕获,全局错误可通过 w…

react如何处理动画

react如何处理动画

处理动画的常用方法 React中处理动画可以通过多种方式实现,包括CSS动画、第三方库或React内置API。以下是几种主流方法: CSS过渡与关键帧动画 直接在组件的CSS中定义transitio…

react如何处理异步

react如何处理异步

异步处理的核心方法 在React中处理异步操作主要依赖以下几种方式: useEffect钩子 适用于组件挂载、更新或卸载时的副作用操作。结合async/await语法可清晰管理异步流程: useE…

react如何处理组件异常

react如何处理组件异常

错误边界(Error Boundaries) React 16+ 引入了错误边界概念,用于捕获子组件树中的 JavaScript 错误。通过定义 static getDerivedStateFromE…

react销毁组件ref如何处理

react销毁组件ref如何处理

React 组件销毁时 Ref 的处理方法 在 React 中,当组件销毁时,与 ref 相关的资源需要妥善处理以避免内存泄漏或意外行为。以下是几种常见的处理方式: 清理 ref 的当前值 在…

react源码如何处理生命周期

react源码如何处理生命周期

React 生命周期处理机制 React 的生命周期处理主要分为三个阶段:挂载(Mounting)、更新(Updating)和卸载(Unmounting)。React 内部通过协调算法(Reconci…