Java标准Base64解码抛IllegalArgumentException,Apache Commons Codec才抛InvalidBase64EncodingException;非法输入包括非Base64字符、长度非4倍数、填充符错误等;推荐捕获对应异常并清洗输入后解码。

Java 中 Base64 解码遇到非法字符时,默认的 java.util.Base64 解码器会抛出 IllegalArgumentException(不是 InvalidBase64EncodingException),因为该异常类并不存在于标准 JDK 中——它属于 Apache Commons Codec 库(org.apache.commons.codec.binary.InvalidBase64EncodingException)。
确认你用的是哪个 Base64 实现
这是问题根源。JDK 8+ 自带的 java.util.Base64 在解码失败时只抛 IllegalArgumentException;而 Apache Commons Codec 的 Base64.decodeBase64() 才会抛 InvalidBase64EncodingException。
- 如果你项目里引入了
commons-codec,且代码调用了new Base64().decode(...)或Base64.decodeBase64(...),那异常来自这里 - 如果只用
java.util.Base64.getDecoder().decode(...),则不会出现该异常名,只会是IllegalArgumentException
常见非法输入场景
以下字符串会导致 Base64 解码失败(无论用哪种实现):
- 含非 Base64 字符:如中文、空格、换行、下划线
_、短横-(除非使用 URL 安全变种) - 长度不是 4 的倍数:Base64 编码要求字符串长度必须为 4 的整数倍,缺位需补
= - 填充符位置错误:如
==出现在开头,或=数量超过 2 个 - 仅含空白字符(空字符串、纯空格等)
安全解码的推荐做法
避免程序崩溃,应捕获对应异常并做容错处理:
立即学习“Java免费学习笔记(深入)”;
- 用 JDK 原生解码时捕获
IllegalArgumentException - 用 Commons Codec 时捕获
InvalidBase64EncodingException(需确保已添加依赖) - 提前清洗输入:去除首尾空格、替换 Windows 换行符、过滤不可见控制字符
- 对不确定来源的数据,可先用正则粗筛:
^[A-Za-z0-9+/]*={0,2}$(标准 Base64)或^[A-Za-z0-9_\-]*={0,2}$(URL 安全 Base64)
一个健壮的解码工具方法示例
兼顾 JDK 和容错逻辑:
public static byte[] safeDecode(String base64Str) {
if (base64Str == null || base64Str.trim().isEmpty()) {
return new byte[0];
}
String clean = base64Str.trim().replace("\r", "").replace("\n", "");
try {
return java.util.Base64.getDecoder().decode(clean);
} catch (IllegalArgumentException e) {
// 可记录日志或返回 null/throw 自定义异常
throw new IllegalArgumentException("Invalid Base64 string: " + base64Str, e);
}
}


















