You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中do-while循环未按预期检查退出条件致空指针异常求助

问题根源分析

你的代码出现NullPointerException的根本原因有两点,结合do-while循环的特性和逻辑漏洞来看:

1. do-while循环的条件判断未先校验currentLine是否为null

在do-while循环的每次迭代中,你都会调用currentLine = readerObject.readLine(),如果文件已经读取到末尾,这个方法会返回null。而你的循环条件直接调用!currentLine.startsWith("DONE"),没有先判断currentLine是否为null,这就导致当currentLine为null时,调用startsWith()方法触发空指针异常。

2. do-while循环的"先执行后判断"特性放大了风险

do-while循环的逻辑是先执行一次循环体代码,再检查退出条件,这会带来两个问题:

  • 如果某个物品的描述之后没有DONE标记,直接到了文件末尾,循环体执行后currentLine会被赋值为null,后续检查条件时必然触发NPE。
  • 你提到的"description行后紧跟DONE仍进入下一次迭代"的情况,大概率是DONE行不符合startsWith("DONE")的匹配条件(比如行首有空格、大小写错误,例如写成done),导致循环条件!currentLine.startsWith("DONE")为true,进入下一次迭代。此时如果DONE是文件最后一行,下一次readLine()会返回null,检查条件时就会抛出NPE。

触发NPE的执行流程还原

假设文件内容如下(无DONE标记):

name: sword
location: cave
description: sharp blade

执行流程:

  1. 外层循环读到description: sharp blade,进入else if分支。
  2. 进入do-while循环,第一次执行循环体:
    • 识别到description:前缀,提取内容sharp blade。
    • 调用readLine(),此时文件已读完,currentLine变为null。
  3. 检查循环条件!currentLine.startsWith("DONE"),此时currentLine为null,直接触发NullPointerException。

补充说明

即使你的文件中都有DONE标记,原代码依然存在逻辑隐患:当DONE行是文件最后一行时,do-while循环退出后,外层循环的下一次迭代会将currentLine赋值为null,外层循环正常退出;但如果DONE行的格式不匹配(比如有前置空格),就会进入下一次迭代,读取到null后触发异常。

内容的提问来源于stack exchange,提问作者ChronicallyOverEngineered

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 06:17:10