
在读取配置或数据文件时,常需忽略以“#”开头的注释行和空行;line.indexOf('#') == 0 是一种安全判断首字符是否为 # 的方式,避免 StringIndexOutOfBoundsException,比 line.charAt(0) == '#' 更健壮。
在读取配置或数据文件时,常需忽略以“#”开头的注释行和空行;`line.indexof('#') == 0` 是一种安全判断首字符是否为 `#` 的方式,避免 `stringindexoutofboundsexception`,比 `line.charat(0) == '#'` 更健壮。
在 Java 文件解析场景中(如加载电影数据 filmovi.txt),我们通常希望程序只处理有效数据行,而自动跳过说明性内容——例如以 # 开头的注释行,以及空白行。这类约定广泛用于 .properties、.csv、自定义配置文件等格式中。
上述代码中的关键判断:
if (line.equals("") || line.indexOf('#') == 0)
continue;其作用正是实现这一过滤逻辑:
-
line.equals(""):检测完全为空的字符串(即纯空行); -
line.indexOf('#') == 0:检查#是否恰好出现在字符串起始位置(索引为 0)。
⚠️ 注意:indexOf()在未找到目标字符时返回-1,因此该表达式天然规避了对空字符串调用charAt(0)可能引发的StringIndexOutOfBoundsException——这是它相比line.charAt(0) == '#'的关键优势。
✅ 正确示例(被跳过):
立即学习“Java免费学习笔记(深入)”;
掌握 ES6+ 特性,包括 async/await、解构、扩展运算符、箭头函数、Promise、模块、迭代器、生成器以及函数式编程模式,编写简洁高效的 Java
# This is a comment # Indented comment (after trim → "# Indented comment" → still starts with #)
❌ 错误写法(有风险):
// 危险!若 line 为空或仅含空格(trim 后为空),charAt(0) 将抛异常 if (line.trim().charAt(0) == '#') // ❌ 不推荐
? 更现代、更清晰的替代方案(Java 11+):
if (line.isBlank() || line.trim().startsWith("#")) {
continue;
}String.isBlank() 同时涵盖空字符串和全空白字符情况,语义更准确;startsWith("#") 在空串上调用也安全,且可读性更强。
最后提醒:实际生产中建议统一使用 trim() + startsWith("#") 组合,并在解析前添加基础校验(如 tokens.length >= 3),防止因格式错误导致 ArrayIndexOutOfBoundsException。稳健的文件解析 = 健壮的前置过滤 + 明确的异常处理。

















