Java中BufferedReader存入char数组后无输出的问题排查
嘿,我立刻就发现你代码里的问题啦!导致没有输出的核心原因有两个,而且你的异常处理还把关键错误信息给隐藏了,难怪你找不到问题所在:
1. 空指针异常被悄悄吞掉,程序根本没走到输出逻辑
你把char[] sentence初始化为null,然后直接在while循环里给sentence[j]赋值——这就像要往一个还没创建的空盒子里放东西,肯定会触发NullPointerException!更糟的是,你的Main方法里的异常捕获块是空的:
catch(Exception e){};
它把所有异常都吞得一干二净,你完全看不到程序运行时的错误提示,自然不知道为什么没有输出。
2. 无法用未初始化的数组存储未知长度的文件内容
你不知道目标文本文件有多少字符,提前把数组设为null或者固定长度的话,要么直接空指针,要么数组容量不够导致越界异常。
修正后的代码方案
推荐用StringBuilder动态存储字符(不用操心数组长度),之后再转成char[]供正则操作使用,同时修复异常处理:
import java.io.BufferedReader; import java.io.FileReader; public class Main { public static void main(String[] args) { try { Task2.doTask2(); } catch(Exception e) { // 别吞异常!打印错误信息才能排查问题 e.printStackTrace(); } } } class Task2 { public static void doTask2() throws Exception { FileReader fr = new FileReader("F:\\Filip\\TextTask2.txt"); BufferedReader br = new BufferedReader(fr); // 用StringBuilder动态存储所有字符,自动扩容 StringBuilder sb = new StringBuilder(); int i; while((i = br.read()) != -1) { sb.append((char)i); } // 转成char数组供后续正则操作 char[] sentence = sb.toString().toCharArray(); // 验证输出 for(char c : sentence) { System.out.print(c); } // 手动关闭流 br.close(); fr.close(); } }
更优雅的优化:用try-with-resources自动管理流
为了避免忘记关闭流或者异常时流未关闭的问题,推荐使用Java 7+的try-with-resources语法,它会自动关闭实现AutoCloseable接口的资源:
class Task2 { public static void doTask2() throws Exception { // try-with-resources会在代码块结束后自动关闭fr和br try (FileReader fr = new FileReader("F:\\Filip\\TextTask2.txt"); BufferedReader br = new BufferedReader(fr)) { StringBuilder sb = new StringBuilder(); int i; while((i = br.read()) != -1) { sb.append((char)i); } char[] sentence = sb.toString().toCharArray(); // 也可以直接打印StringBuilder内容,不用转数组 System.out.println(sb); } } }
内容的提问来源于stack exchange,提问作者Tami
相关产品推荐
相关产品推荐

