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

Java遍历HashMap打印值时System.out.println输出异常空行问题

异常原因

核心问题是level字段的类型选型错误+对char类型的打印逻辑认知偏差:

  • 你的数据集里level是数值(10、13),但你把字段定义成了char类型。char本质是16位无符号整数,当直接给char类型赋值10、13时,存储的不是文本形式的数字"10""13",而是ASCII/Unicode编码对应的不可见控制字符:
    • 值10对应'\n'(换行符LF):打印时会直接输出一个换行
    • 值13对应'\r'(回车符CR):打印时会将光标移动到当前行首,在常见控制台环境下会配合后续换行产生空行效果
  • System.out.println(char c)的执行逻辑是:先打印传入的字符本身,再自动追加一个系统换行符。
    • 对第一条记录的level=10:先打印换行符,再追加println自带的换行,总共两个换行,对应你输出里code值下方的两个空行
    • 对后三条记录的level=13:先打印回车符(光标回到行首,无可见内容),再追加println自带的换行,总共一个空行,对应你输出里后三条code值下方的单个空行
  • IntelliJ调试器显示char类型变量时,默认直接展示它存储的整数值,不会转成对应字符显示,所以你调试时看到值是10、13会误以为取值正确,实际上类型本身就用错了。
验证方式

跑下面的极简测试代码,就能100%复现你遇到的输出异常:

public class CharPrintTest {
    public static void main(String[] args) {
        char levelForFirstRecord = 10;
        char levelForOtherRecord = 13;
        // 模拟第一条记录输出
        System.out.println(274672398340L);
        System.out.println(levelForFirstRecord);
        System.out.println(561.53235f);
        // 模拟第二条记录输出
        System.out.println(1125058143634206L);
        System.out.println(levelForOtherRecord);
        System.out.println(68.06594f);
    }
}
修复方案
  • 长期修复:level是存储等级数值的字段,直接把字段类型从char改成int或者short,后续打印、计算都不会出现这类类型转换问题
  • 临时修复:如果暂时不能改字段类型,打印时把char强转为int,就能输出你期望的数字10、13:
    System.out.println((int)level);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:12:13