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):打印时会将光标移动到当前行首,在常见控制台环境下会配合后续换行产生空行效果
- 值10对应
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
相关产品推荐
相关产品推荐

