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),不如让程序快速失败,便于排查问题。

相关推荐
一 乐几秒前
校园线上招聘|基于springboot + vue校园线上招聘系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·校园线上招聘系统
不懂的浪漫3 分钟前
mqtt-plus 架构解析(四):MqttMessageInterceptor 的扩展点设计
java·spring boot·物联网·mqtt
西海天际蔚蓝4 分钟前
AI配合写的第一个demo系统页面
java·人工智能
小旭952718 分钟前
Spring Security 实现权限控制(认证 + 授权全流程)
java·后端·spring
金銀銅鐵24 分钟前
[Java] 如何通过 cglib 的 FastClass 调用一个类中的“任意”方法?
java·后端
阿维的博客日记43 分钟前
为什么会增加TreeMap和TreeSet这两类,有什么核心优势吗?可以解决什么核心痛点?
java·treeset·treemap
dllxhcjla1 小时前
黑马头条1
java
宠友信息1 小时前
一套基于uniapp+springboot完整社区系统是如何实现的?友猫社区源码级功能解析
java·spring boot·后端·微服务·微信·uni-app
humors2211 小时前
各厂商工具包网址
java·数据库·python·华为·sdk·苹果·工具包
无限进步_1 小时前
【C++&string】大数相乘算法详解:从字符串加法到乘法实现
java·开发语言·c++·git·算法·github·visual studio