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

Java中如何用BufferedReader读取多行输入?遇异常求助

如何用Java的BufferedReader读取多行结构化输入

别慌,我来帮你搞定这个多行输入读取的问题,顺便排查下你遇到的NullPointerException(NPE)和奇怪的**********提示的坑。

首先,先明确你的输入结构:

  • 第一行是测试用例数量T
  • 每个测试用例包含两行:一行是3个空格分隔的参数,另一行是空格分隔的数组

正确的读取实现代码

我直接给你一个可运行的示例,你可以参考这个来调整你的读取逻辑:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class InputReaderDemo {
    public static void main(String[] args) {
        // 用try-with-resources自动关闭流,避免资源泄漏
        try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
            // 读取T,先trim掉换行和空格,再转整数
            String tLine = br.readLine();
            if (tLine == null) {
                System.err.println("未读取到测试用例数量");
                return;
            }
            int T = Integer.parseInt(tLine.trim());
            
            // 循环处理每个测试用例
            for (int caseNum = 0; caseNum < T; caseNum++) {
                // 读取参数行
                String paramLine = br.readLine();
                if (paramLine == null) {
                    System.err.println("测试用例" + (caseNum+1) + "缺少参数行");
                    break;
                }
                String[] paramParts = paramLine.trim().split("\\s+");
                // 确保参数行有3个数字,避免数组越界
                if (paramParts.length != 3) {
                    System.err.println("测试用例" + (caseNum+1) + "参数格式错误");
                    continue;
                }
                int p1 = Integer.parseInt(paramParts[0]);
                int p2 = Integer.parseInt(paramParts[1]);
                int p3 = Integer.parseInt(paramParts[2]);
                
                // 读取数组行
                String arrayLine = br.readLine();
                if (arrayLine == null) {
                    System.err.println("测试用例" + (caseNum+1) + "缺少数组行");
                    break;
                }
                String[] arrayStrs = arrayLine.trim().split("\\s+");
                int[] array = Arrays.stream(arrayStrs)
                                    .mapToInt(Integer::parseInt)
                                    .toArray();
                
                // 这里替换成你的业务逻辑,比如打印验证读取结果
                System.out.println("\n测试用例 " + (caseNum+1) + " 读取完成:");
                System.out.println("参数: " + p1 + ", " + p2 + ", " + p3);
                System.out.println("数组: " + Arrays.toString(array));
            }
        } catch (IOException e) {
            System.err.println("读取输入时发生IO错误:");
            e.printStackTrace();
        } catch (NumberFormatException e) {
            System.err.println("输入包含非整数内容,请检查格式:");
            e.printStackTrace();
        }
    }
}

关键细节和坑点排查

  1. 为什么会出现NullPointerException?

    • 最常见的原因是br.readLine()返回了null(比如输入提前结束,行数不够),但你直接调用了trim()或split()方法,这就会触发NPE。上面的代码里每次读取后都先判断line == null,就是为了避免这个问题。
    • 另外,如果你的BufferedReader对象没有正确初始化(比如被赋值为null),调用readLine()也会触发NPE,确保你是通过new BufferedReader(new InputStreamReader(System.in))创建的实例。
  2. 为什么会出现**********提示?

    • 大概率是你的程序抛出了异常,但控制台输出被截断了。加上上面的异常捕获逻辑,就能看到具体的错误信息,而不是模糊的**********。
  3. 为什么要用\\s+分割?

    • 这个正则表达式匹配一个或多个空格,能处理输入中可能出现的多个连续空格,避免分割出空字符串。

调试小技巧

  • 在读取每一行后,先打印出来,比如System.out.println("读取到行: " + line),这样你就能确认是否正确读取了输入内容,方便定位问题。

内容的提问来源于stack exchange,提问作者Shalom T Alexander

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:55:20