string.repeat() 调用需校验参数非负且不过大,否则抛 illegalargumentexception 或 outofmemoryerror;空字符串重复结果仍为空;推荐前置检查 n >= 0 && n

Java 11 String.repeat() 怎么用才不抛异常
调用 String.repeat() 最常见的错误是传负数或极大值,直接触发 IllegalArgumentException 或 OutOfMemoryError。它不是“安全重复”,而是严格按参数执行——底层用 Arrays.fill() 拼接,没做容错。
-
"a".repeat(-1)→ 抛IllegalArgumentException: count is negative -
"x".repeat(Integer.MAX_VALUE)→ 很可能 OOM,字符串长度超Integer.MAX_VALUE时会提前失败 - 空字符串
"".repeat(100)合法,结果仍是"",这点和 Python 的*行为一致 - 推荐在重复前加校验:
if (n >= 0 && n ,尤其当 <code>n来自用户输入或配置时
为什么 String.isBlank() 比 trim().isEmpty() 更准
isBlank() 判断的是“是否只含空白字符(包括 Unicode 空格、不换行空格、零宽空格等)”,而 trim().isEmpty() 依赖 Character.isWhitespace() 的旧实现,漏掉不少 Unicode 空白。比如 "\u2000"(中文空格)在 Java 8 下 trim() 不处理,isBlank() 能正确返回 true。
-
" ".isBlank()→true(全角空格 U+3000) -
"\u200B".isBlank()→true(零宽空格) -
" \t\n".isBlank()→true,和trim().isEmpty()行为一致 - 但
"\u00A0".isBlank()(不换行空格)在 Java 11+ 返回true,Java 8 的trim()不识别它
这两个方法在真实项目里该不该无脑替换
不能直接全局替换。虽然语义更清晰,但存在兼容性和性能差异。
网趣购物系统静态版支持网站一键静态生成,采用动态进度条模式生成静态,生成过程更加清晰明确,商品管理上增加淘宝数据包导入功能,与淘宝数据同步更新!采用领先的AJAX+XML相融技术,速度更快更高效!系统进行了大量的实用性更新,如优化核心算法、增加商品图片批量上传、谷歌地图浏览插入等,静态版独特的生成算法技术使静态生成过程可随意掌控,从而可以大大减轻服务器的负担,结合多种强大的SEO优化方式于一体,使
- 升级到 Java 11+ 后,旧代码里的
str == null || str.trim().isEmpty()必须补 null 检查:str == null || str.isBlank(),否则 NPE -
isBlank()比trim().isEmpty()略快(少一次新字符串分配),但差距微乎其微;repeat()在小次数下比手动 for 循环略快,大次数下和StringBuilder拼接接近 - 如果项目要兼容 Java 8,别用它们——连编译都过不去,得回退或加反射兜底
- Spring Boot 2.1+ 默认基线是 Java 11,这类方法可放心用;但写工具类供多版本使用时,仍需谨慎
容易被忽略的边界:空字符串、null 和不可变性
这两个方法都不处理 null,这是最常踩的坑。Java 没有像 Kotlin 那样的安全调用符,null.isBlank() 会直接炸。
立即学习“Java免费学习笔记(深入)”;
-
"".repeat(0)→"",合法 -
null.repeat(1)→NullPointerException(不是IllegalArgumentException) -
null.isBlank()→NullPointerException - 所有
String方法都返回新对象,repeat()和isBlank()不改变原字符串,这点和预期一致,但新手有时误以为isBlank()会“清理”字符串
真正麻烦的是混合场景:比如从 JSON 解析出可能为 null 的字段,又想判空再重复,必须拆成两步——先判 null,再调用。漏掉这步,线上就挂。









