string.repeat要求参数≥0,负数抛illegalargumentexception,null调用仍npe;isblank替代null安全的trim().isempty(),支持unicode空白,二者组合使用需显式判空防npe。

Java 11 的 String.repeat 和 isBlank 是轻量但高频的实用方法,不是语法糖,而是为解决真实空值/重复字符串场景设计的——用对了能少写 null 检查和循环,用错了反而引入 NPE 或性能陷阱。
为什么 String.repeat 不能传负数,且对空串返回也得小心
repeat 要求参数 ≥ 0,传负数直接抛 IllegalArgumentException;更隐蔽的是:传 0 返回空串 "",但若原字符串是 null,调用前没判空,照样 NPE——它不处理 null,只处理已存在的字符串。
- 常见错误现象:
str.repeat(n)在str为null时崩溃,而不是静默返回null - 使用场景:生成固定长度分隔线(
"-".repeat(20))、填充占位符(" ".repeat(indent)) - 参数差异:只接受
int,不支持long;超大值(如Integer.MAX_VALUE)可能触发OutOfMemoryError,实际建议控制在几万以内 - 示例:
"x".repeat(3)→"xxx","".repeat(5)→"",null.repeat(1)→ 抛NullPointerException
isBlank 和 isEmpty 到底差在哪,什么时候该换掉旧写法
isBlank 真正的价值是替代手写的 str == null || str.trim().isEmpty(),它把 null 安全、空白字符判断(包括全角空格、制表符、换行符等 Unicode 空白)全包了;而 isEmpty 只看长度,null 仍需单独判断。
- 常见错误现象:用
isEmpty判断用户输入的文本框内容,结果用户只打了空格,逻辑却误判为“非空” - 使用场景:表单校验、配置项解析、日志行过滤(跳过纯空白行)
- 性能影响:比
trim().isEmpty()快,因为它不新建字符串,内部逐字符扫描,遇到非空白就停 - 注意兼容性:Java 11+ 才有,Android 需 API 26+,旧项目升级时别漏掉运行时版本检查
两个方法组合用时,最容易忽略的边界情况
比如想把用户输入的标签名统一补足到 10 位,用 input.isBlank() ? "N/A".repeat(2) : input 这类逻辑,看似合理,实则埋雷。
立即学习“Java免费学习笔记(深入)”;
- 容易踩的坑:
isBlank返回 true 时,input可能是null或纯空白字符串,但后续如果对input做.length()或.charAt(0),依然会 NPE - 推荐写法:先
if (input == null || input.isBlank()) { ... }显式分支,别依赖isBlank后还拿原变量做其他操作 - 另一个坑:
" \t\n".repeat(2)结果是带空白的重复串,不是“重复两次‘非空白内容’”,别误以为isBlank和repeat是语义互补的“一对”
这两个方法小,但恰恰因为小,容易被当成“随便用用”,结果在 null 处理、Unicode 空白、大数重复上翻车。真要稳,就得把 null 检查、参数范围、字符集行为都当默认前提来写,而不是靠文档里一句“安全”就放心交出去。










