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

Java读取文本文件如何避免内容耗尽后在命令行打印null值

问题原因

  • 构造方法的循环条件逻辑错误:原代码使用||(逻辑或)作为循环终止判断,只要「数组下标未超限」或「还有文件内容可读」任意一个条件成立就会继续循环,因此文件内容读完后,循环还会一直执行到下标达到100才停止,未赋值的数组元素默认值为null。
  • 输出逻辑未区分有效内容:contents和display方法直接遍历整个100长度的数组,没有跳过未读取内容的空元素。

修复方案

1. 调整构造方法逻辑

将循环条件改为&&(逻辑与),同时新增成员变量记录实际读取到的有效行数,作为后续输出的边界,同时补充资源关闭操作避免泄露:

// 新增成员变量记录实际读取的有效行数
int validLineCount = 0;

TextFileReader(String fileName) {
    try {
        FileInputStream fis = new FileInputStream(fileName);
        Scanner scan = new Scanner(fis);
        // 循环条件改为逻辑与:下标没超限且还有内容可读才继续循环
        for(int i = 0; i < stringArray.length && scan.hasNextLine(); i++) {
            stringArray[i] = scan.nextLine();
            validLineCount++;
        }
        scan.close();
    } catch(IOException e) {
        e.printStackTrace();
    }
}

2. 调整输出方法的遍历边界

仅遍历有效行数范围内的元素:

public String contents(String fileName) {
    StringBuffer sb = new StringBuffer();
    // 仅遍历有效内容
    for(int i = 0; i < validLineCount; i++) {
        sb.append(stringArray[i]);
    }
    return sb.toString();
}

public void display(String fileName) {
    // 仅遍历有效内容
    for(int i = 0; i < validLineCount; i++) {
        System.out.println(i + ": " + stringArray[i]);
    }
}

完整修正后代码

import java.io.*;
import java.util.Scanner;
public class TextFileReader {
    
    String[] stringArray = new String [100];
    int validLineCount = 0;
    
    TextFileReader() {
        
    }
    
    TextFileReader(String fileName) {
        try {
            FileInputStream fis = new FileInputStream(fileName);
            Scanner scan = new Scanner(fis);
            for(int i = 0; i < stringArray.length && scan.hasNextLine(); i++) {
                stringArray[i] = scan.nextLine();
                validLineCount++;
            }
            scan.close();
        } catch(IOException e) {
            e.printStackTrace();
        }
    }
    
    public String contents(String fileName) {
        StringBuffer sb = new StringBuffer();
        for(int i = 0; i < validLineCount; i++) {
            sb.append(stringArray[i]);
        }
        return sb.toString();
    }
    
    public void display(String fileName) {
        for(int i = 0; i < validLineCount; i++) {
            System.out.println(i + ": " + stringArray[i]);
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:45:03