不能直接用String.substring()提取后缀,因为需先用lastIndexOf(".")安全定位点位置,再结合lastIndexOf("/")等判断边界条件,否则易抛异常或返回错误结果。

为什么不能直接用 String.substring() 提取后缀?
因为后缀名总在最后一个点(.)之后,而 substring() 需要明确起始索引。如果路径里没有点(比如 "README")、或以点结尾("file.")、或根本是目录("/home/user/"),硬写 substring(index + 1) 会抛 StringIndexOutOfBoundsException 或返回错误结果。
必须先用 lastIndexOf() 定位点的位置
lastIndexOf(".") 返回最后一个点的下标,没找到则返回 -1 —— 这个返回值就是安全判断的关键。
实操时按以下逻辑分支处理:
- 若
lastIndexOf(".") == -1:无点,无后缀,返回空字符串或null - 若
lastIndexOf(".") == path.length() - 1:点在末尾,如"file.",不算有效后缀 - 若
lastIndexOf(".") == 0且路径形如".gitignore":这是合法隐藏文件,点后内容应作为后缀 - 否则,
substring(lastIndexOf(".") + 1)才是安全的
常见错误场景和对应修复
这些坑实际开发中高频出现:
- 用
indexOf(".") + 1替代lastIndexOf(".")+1→ 对"archive.tar.gz"会错取成"ar.gz" - 忽略路径含斜杠干扰 →
"/path/to/file.txt"中的点只关心最后一段,但lastIndexOf(".");本身已天然满足,无需额外截断目录部分 - 未检查点是否在文件名开头 →
".config"的后缀是"config",不是空;但"/.hidden/"(结尾有斜杠)的lastIndexOf(".")是 -1,需靠路径是否以/结尾辅助判断
简单健壮写法示例:
lastIndexOf()










