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

BufferedReader报“Unknown Source”错误,读取产品文件创建Product对象求助

解决BufferedReader读取文件时的"Unknown Source"错误及循环创建Product对象的正确姿势

嘿,我来帮你捋捋这个问题~首先,"Unknown Source"这个提示大多是因为编译代码时没生成调试信息(比如用javac命令时没加-g参数),导致异常栈没法显示具体的代码行,先记下来,之后编译加上-g就能看到准确的报错位置,排查起来会方便很多。

接下来说说你遇到的核心问题:读取到Pear时出错,以及循环创建Product对象的逻辑问题。结合你说的文件格式(用\r换行),我整理了几个可能的坑和对应的解决方案:

1. 换行符\r的处理

BufferedReader的readLine()方法其实支持识别\r作为行终止符,它会自动把\r、\n或者\r\n都当作换行,返回的行内容里不会包含这些终止符。不过如果你的文件里混合了不同的换行符(比如有的行用\r,有的用\n),就可能导致读取的行内容混乱。如果确实是换行符的问题,你可以自定义Reader把所有\r替换成\n,确保行分隔一致:

InputStream is = new FileInputStream("你的文件路径");
Reader reader = new InputStreamReader(is) {
    @Override
    public int read(char[] cbuf, int off, int len) throws IOException {
        int n = super.read(cbuf, off, len);
        if (n != -1) {
            for (int i = off; i < off + n; i++) {
                if (cbuf[i] == '\r') {
                    cbuf[i] = '\n';
                }
            }
        }
        return n;
    }
};
BufferedReader br = new BufferedReader(reader);

2. 循环创建Product对象的正确逻辑

你说每个产品对应三行信息:描述、编码、价格,那循环的关键是每次先读取描述行,确认不为null后再读取另外两行,还要额外检查编码和价格行是否存在,避免文件末尾信息不完整导致空指针或解析错误。错误的逻辑可能是在循环里直接读取后续行,没判断是否为null,比如读到文件末尾时,描述行是null,但你还继续读编码和价格,自然会报错。

给你一个安全的实现示例:

List<Product> productList = new ArrayList<>();
// 用try-with-resources自动关闭流(Java 7+支持)
try (BufferedReader br = new BufferedReader(new FileReader("你的文件路径"))) {
    String desc, code, priceStr;
    // 先读取描述行,为null就退出循环
    while ((desc = br.readLine()) != null) {
        // 读取编码和价格行
        code = br.readLine();
        priceStr = br.readLine();
        
        // 检查这两行是否为null,避免不完整的产品信息
        if (code == null || priceStr == null) {
            System.err.println("发现不完整的产品信息,跳过当前条目");
            continue;
        }
        
        try {
            // 解析价格,处理格式错误的情况
            double price = Double.parseDouble(priceStr);
            Product product = new Product();
            product.setDescription(desc);
            product.setProductCode(code);
            product.setProductPrice(price);
            productList.add(product);
        } catch (NumberFormatException e) {
            System.err.println("价格格式错误:" + priceStr + ",跳过该产品");
            e.printStackTrace();
        }
    }
} catch (IOException e) {
    e.printStackTrace();
}

3. 额外注意事项

  • 一定要处理NumberFormatException:如果文件里的价格不是合法的数字,直接解析会抛出异常,捕获并处理能避免整个程序崩溃。
  • 优先用try-with-resources:Java 7及以上版本推荐这种写法,不用手动关闭流,能有效防止资源泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:53:49