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
相关产品推荐
相关产品推荐

