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

JFreeChart 基于TXT数据源绘制柱状图时缺失最后一行对应柱形的问题

异常根因定位
  • 先排查文件读取逻辑:你写的BufferedReader逐行读文件的代码本身没有漏读最后一行的问题,18行文本都会被正常读取处理,不存在循环跳行的bug。
  • 真正的问题出在数据集构建环节:你把每行的位置字符串直接作为横轴分类标签传入dataset.addValue(),但提供的数据源里有两个不同停车场对应完全一样的位置名"Dundasvale"——分别是第3行ID为CPG21C的停车场、第18行ID为CPG01C的停车场。
  • DefaultCategoryDataset的运行规则是:如果传入的分类键已经存在,只会更新这个分类对应的柱形数值,不会额外新增一根同名标签的柱形。18行数据去重分类键后刚好得到17个不重复的标签,和你看到的“只渲染17根柱形”的现象完全吻合。
  • 你看到的“跳过最后一行”的错觉,本质是最后一行的标签已经被第三行提前占用,处理到最后一行时只是用它的占用率数值覆盖了原有Dundasvale柱形的高度,没有新增柱形,看起来就像这行被完全丢弃了。
修复方案
  • 给横轴分类标签补充唯一标识,从根源避免重名合并:不要单独用location作为分类键,把停车场ID和位置拼接成带唯一标识的标签再传入数据集,比如使用theBSTP.getId() + " - " + theBSTP.getLocation()作为分类值,保证每个停车场对应独立的柱形。
  • 把当前的手动读行循环改写为JDK里标准的读行写法,减少后续维护的出错概率:
    // 替换原来的“先初始化line、循环内二次调用readLine”的写法
    String line;
    while ((line = br.readLine()) != null) {
        // 原有行拆分、对象构建、数值添加的逻辑完全保留
    }
    
    这种写法和你当前的读行逻辑功能完全一致,但去掉了重复的读行代码,避免后续修改时出现多跳一行、漏读一行的问题。
  • 补充一个代码优化点:你当前用了try-with-resources语法初始化BufferedReader,代码块执行完成后会自动关闭流,不需要再手动调用br.close(),这段重复的关闭代码可以删掉。
  • 调试阶段可以加一行日志,打印每次传入数据集的分类标签和对应数值,跑一遍就能直观看到两个同名"Dundasvale"的处理过程,确认覆盖逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 21:36:03