已做非空校验仍触发Null Pointer Exception的异常问题咨询
问题根因分析
你贴出的示例代码逻辑上不会触发这个空指针异常,出现该问题通常是以下几种实际场景导致的:
- 场景1:实际运行的代码和你贴出的代码不一致,在while条件中没有把
readLine()的返回值赋值给currentLine,而是两次调用readLine(),典型错误写法如下:
// 错误写法 while(reader.readLine() != null) { String currentLine = reader.readLine(); // 第二次读行,读到流末尾时直接返回null currentLine.trim(); }
该写法每轮循环会读取两行,当文件行数为奇数时,最后一次循环就会拿到null值触发空指针,是这类问题最常见的诱因。
- 场景2:
currentLine是类成员变量而非方法局部变量,且存在多线程同时修改该变量的情况:while条件判断currentLine不为空之后、执行trim()之前,其他线程把currentLine赋值为null,就会触发空指针。 - 场景3:读取文件过程中文件被其他进程/线程修改、截断或删除,导致流提前读到末尾返回null,这类情况多出现于共享目录的文件读取场景。
修复方案
- 优先核对实际运行代码的循环逻辑,确保
readLine()的返回值只读取一次且直接赋值给currentLine,和你贴出的示例代码保持一致 - 把
currentLine改为方法内的局部变量,避免多线程篡改,如果必须用成员变量,要加同步锁保证判断和操作的原子性 - 读取文件前加文件存在、长度非空的校验,读取过程中锁定文件避免其他进程修改
- 极端场景兼容可以在循环体内再加一层非空校验:
while((currentLine = reader.readLine()) != null) { if (currentLine != null) { String trimmedLine = currentLine.trim(); // 后续业务逻辑 } }
内容的提问来源于stack exchange,提问作者NEERAJ yadav
相关产品推荐
相关产品推荐

