You need to enable JavaScript to run this app. Java中使用FileReader/BufferedReader读取文本出现叠加null及二维char数组存入失败问题
优惠活动
大模型
产品
解决方案
定价
更多

Java中使用FileReader/BufferedReader读取文本出现叠加null及二维char数组存入失败问题

Java读取txt存入二维char数组异常问题梳理

核心需求

作为Java开发新手,需要完成的功能是读取.txt格式文件的内容并存入二维char数组,当前遇到两个核心故障:

  • 二维数组始终没有成功写入任何有效数据
  • 使用FileReader、BufferedReader读取内容时,输出的文本末尾会叠加大量null值

异常输出示例

This is ridiculously hardnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnull

代码存在的核心问题

  • 对readLine()方法的逻辑理解偏差:readLine()每调用一次只会读取文件的一行文本,当文件所有内容读取完成后,该方法会返回null。原代码嵌套循环(6行*7列=42次循环)会强制调用42次readLine(),如果Code.txt只有1行有效内容,剩下41次调用都会拿到null;而String类型的null被打印时,会直接输出字面量字符串"null",这就是输出末尾叠加大量null值的直接原因。
  • 读取流重复定义冗余:代码同时初始化了Scanner和BufferedReader两个独立的文件读取流指向同一个Code.txt,两个流各自维护独立的文件读取指针,逻辑冗余还容易引发冲突。
  • 二维char数组赋值逻辑完全失效:
    • 赋值循环的触发条件j > columns初始值为j=0,永远不满足,整个循环根本不会执行,这就是数组里没有写入任何有效数据的核心原因。
    • 数组边界规则完全错误:new char[6][7]的合法下标范围是行05、列06,代码中“i大于6才自增j”的逻辑不仅会触发数组下标越界报错,和实际的数组尺寸也完全不匹配。
    • 重复赋值覆盖问题:代码连续给RotaryMachine[i][j]位置做了两次赋值,第一次取的字符会被第二次的*直接覆盖。
  • 流资源处理不规范:手动关闭流的操作没有异常兜底,一旦读取过程抛出异常,流不会被正常关闭,容易造成系统文件句柄泄漏。

可运行的修正参考实现

修正思路:先按行读取文件内容,逐字符将有效内容填入二维数组,使用try-with-resources语法自动管理流资源,避免手动关闭的遗漏。

import java.io.*;
import java.util.Arrays;

public class Enigma {
    public static void main(String[] args) {
        int rows = 6;
        int columns = 7;
        char[][] RotaryMachine = new char[rows][columns];
        // try-with-resources会在代码执行结束后自动关闭实现AutoCloseable接口的流对象
        try (BufferedReader br = new BufferedReader(new FileReader("Code.txt"))) {
            String currentLine;
            int rowIndex = 0;
            // 循环读取直到文件末尾:readLine()返回null代表无更多内容
            while ((currentLine = br.readLine()) != null && rowIndex < rows) {
                int colIndex = 0;
                // 逐字符把行内容填入对应数组位置
                for (char c : currentLine.toCharArray()) {
                    if (colIndex >= columns) break; // 超出预设列数则停止填充当前行
                    RotaryMachine[rowIndex][colIndex] = c;
                    colIndex++;
                }
                rowIndex++;
            }
        } catch (FileNotFoundException e) {
            System.out.println("未找到Code.txt文件");
        } catch (IOException e) {
            System.out.println("读取文件时发生错误:" + e.getMessage());
        }
        // 打印数组内容验证结果
        for (char[] row : RotaryMachine) {
            System.out.println(Arrays.toString(row));
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 17:06:03