Java 异常处理:3 个 “避坑神操作”,告别崩溃式报错

做 Java 开发谁没踩过异常的坑?比如空指针直接让程序 "原地去世",try-catch 裹成 "千层饼",报错信息含糊到 debug 半小时找不到问题。今天分享 3 个最常用的异常处理技巧,代码简洁还实用,新手也能轻松拿捏~

1. 空指针防护:别再写一堆 if 判空!

日常开发中,空指针是最常见的异常。推荐用Objects.requireNonNullElse(Java 9+)或Optional类,一行搞定空值处理:

java 复制代码
import java.util.Objects;
import java.util.Optional;

public class ExceptionDemo {
    public static void main(String[] args) {
        String userName = null; // 模拟可能为空的参数
        Integer age = null;

        // 技巧1:Objects工具类(直接指定默认值)
        String safeName = Objects.requireNonNullElse(userName, "匿名用户");
        System.out.println("用户名:" + safeName); // 输出:匿名用户

        // 技巧2:Optional类(更灵活的空值处理)
        Integer safeAge = Optional.ofNullable(age)
                                 .orElse(18); // 为空则返回默认值18
        System.out.println("年龄:" + safeAge); // 输出:18

        // 进阶:为空时抛自定义异常
        Optional.ofNullable(userName)
                .orElseThrow(() -> new IllegalArgumentException("用户名不能为空!"));
    }
}

2. 多异常处理:别写 N 个 catch 块!

多个异常只需统一处理时,用 "|" 合并异常类型,代码瞬间清爽:

java 复制代码
// 技巧3:合并异常处理(避免重复代码)
public static void handleMultiException(String str) {
    try {
        Integer num = Integer.parseInt(str); // 可能抛NumberFormatException
        System.out.println("转换结果:" + num);
    } catch (NumberFormatException | NullPointerException e) {
        // 一个catch处理两种异常
        System.out.println("错误:输入参数无效!原因:" + e.getMessage());
    }
}

// 调用测试
public static void main(String[] args) {
    handleMultiException("abc"); // 抛NumberFormatException
    handleMultiException(null);  // 抛NullPointerException
}

二、关键注意事项

  1. 别用e.printStackTrace()!建议用日志框架(如 SLF4J)打印,方便定位问题;

  2. 自定义异常时,要包含详细的错误信息,别只抛 "发生异常" 这种无用提示;

  3. 不要滥用 try-catch,比如不需要处理的运行时异常(如 IndexOutOfBoundsException),不如让程序快速失败,便于排查问题。

相关推荐
tryxr6 分钟前
Chat2Excel 文件服务模块上传文件功能开发
java·项目·oss·easyexcel·文件服务
Tangyuewei9 分钟前
Java 写 Agent:模型只是组件
java·开发语言
彧azz1 小时前
Java学习语法篇:变量
java·学习
信誓旦旦的程序猿2 小时前
【量化系统从零构建 #04】存储设计:选型·建库·交易日历
java·人工智能·python·股票数据api·股票数据·股票数据api接口·股票api数据接口
yurenpai(27届找实习中)2 小时前
Java 10 的 var 为什么不能随便用?从订单汇总看懂类型推断与泛型陷阱
java·开发语言·java18
Flynt3 小时前
把公司项目迁到 Spring Boot 4.0:编译通过只是开始
java·spring boot·后端
Tangyuewei4 小时前
给老 Spring 项目装个 AI Agent
java·人工智能·spring
她的男孩4 小时前
多租户和数据权限怎么共存?扒完拦截器注册链路,我找到 4 个隐蔽的坑
java·后端·架构
小溪学编程4 小时前
Java BufferedReader 详解:从基础用法到性能优化
java·python·性能优化
HZero.chen5 小时前
Java 匿名类简介
java·匿名类