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

Java读取文本文件后line变量为null引发异常的原因咨询

问题解析:为什么readFile方法末尾的line会是null?

这问题我之前踩过一模一样的坑,核心就是没搞明白while((line = br.readLine()) != null)这个循环的执行逻辑!

先拆解循环的执行流程

咱们一步步捋清楚这个while循环到底在做什么:

  1. 每次循环先执行赋值操作:先调用br.readLine()读取一行内容,把结果直接赋值给变量line
  2. 再判断是否进入循环体:检查line是不是null,如果不是null,才会进入循环内部执行roomNumberField.setText(line)
  3. 循环退出的触发条件:当文件读到末尾时,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:41:55