Java读取文本文件后line变量为null引发异常的原因咨询
问题解析:为什么readFile方法末尾的line会是null?
这问题我之前踩过一模一样的坑,核心就是没搞明白while((line = br.readLine()) != null)这个循环的执行逻辑!
先拆解循环的执行流程
咱们一步步捋清楚这个while循环到底在做什么:
- 每次循环先执行赋值操作:先调用
br.readLine()读取一行内容,把结果直接赋值给变量line - 再判断是否进入循环体:检查
line是不是null,如果不是null,才会进入循环内部执行roomNumberField.setText(line) - 循环退出的触发条件:当文件读到末尾时,
br.readLine()会返回null,这时候line被赋值为null,紧接着判断null != null不成立,循环直接退出
所以,当循环结束的时候,line的值就是最后一次br.readLine()返回的null!这时候你在循环外面调用writeFile(line),传进去的自然是null,后续转int或者调用trim()肯定会抛出异常。
为什么移到循环内就正常?
当你把writeFile(line)放到循环体里面时,只有当line != null的情况下才会执行到这行代码(因为进入循环体的前提就是已经判断过line不为null),所以传进去的都是有效的文本内容,程序自然能正常运行。
给你两种适配场景的修正方案
根据你的描述,文件里只存了一个数字99,应该是单行内容,推荐第一种方案:
方案1:直接读取单行(最适配你的场景)
public void readFile() { String line = ""; try(FileReader fr = new FileReader("Room Number.txt"); BufferedReader br = new BufferedReader(fr)) { line = br.readLine(); // 直接读取一行,不需要循环 if(line != null) { // 先判断非空再操作,彻底避免空指针 roomNumberField.setText(line); writeFile(line); } } catch (IOException ex) { ex.printStackTrace(); } }
方案2:保留循环(适配未来可能的多行场景)
如果以后你的文件可能有多行内容,需要逐行处理,就把写入逻辑放在循环内:
public void readFile() { String line = ""; try(FileReader fr = new FileReader("Room Number.txt"); BufferedReader br = new BufferedReader(fr)) { while((line = br.readLine()) != null) { roomNumberField.setText(line); writeFile(line); // 循环内调用,保证line始终非空 } } catch (IOException ex) { ex.printStackTrace(); } }
内容的提问来源于stack exchange,提问作者user7500403
相关产品推荐
相关产品推荐

