Java ArrayList打印输出时元素单独换行异常问题排查
问题根源
你的ArrayList存储逻辑本身没有bug,异常来自文件读取环节没有正确处理行尾控制符,导致每个存入列表的字符串末尾都携带了不可见的换行类控制字符,打印时就会出现每个元素单独换行的错位效果。
你在代码里给Scanner手动设置了分隔符"\n",但Windows系统下文本文件默认的行尾标识是\r\n(回车+换行两个控制字符),这种配置下sc.next()只会以\n作为切分边界,切出来的每个字符串末尾都会残留\r回车符。打印ArrayList时,JDK默认的toString()逻辑会把元素按元素1, 元素2, 元素3的格式拼接,遇到每个元素末尾的\r就会触发光标换行,最终就输出了你看到的每个元素单独占一行、逗号跑到下一行行首的异常格式。
你提到的存储物品名称的ArrayList出现完全相同的问题,也是因为读取物品配置文件时用了一模一样的分隔符配置,根源完全一致。
修复方法
- 优先使用Scanner原生逐行读取逻辑:删除自定义分隔符的代码,直接用
nextLine()方法读行,该方法会自动适配Windows、macOS、Linux不同系统的行尾格式,返回的字符串默认不携带行尾控制字符。修改后的读取核心代码如下:
Scanner sc = new Scanner(new File("Action.txt")); // 删除 sc.useDelimiter("\n"); 这行配置 int i = 0; while (sc.hasNextLine()){ String name = sc.nextLine().trim(); // 调用trim()顺便清理首尾可能存在的多余空格、空行 actionName[i] = name; i++; }
- 临时兼容方案:如果不想改动整体读取结构,就在每次拿到
sc.next()的返回结果后,手动调用trim()方法清除首尾的所有空白、控制字符,即把String name = sc.next();改成String name = sc.next().trim();,也能把残留的\r等控制符清理干净,解决打印换行的问题。
内容的提问来源于stack exchange,提问作者Ryanzz
相关产品推荐
相关产品推荐

