Java行格式校验:点符号格式错误检测失效问题排查
问题分析与修复方案
你的点符号校验逻辑失效主要是两个核心问题:边界情况处理遗漏和条件判断逻辑不够严谨,咱们一步步拆解并修复。
原代码的关键问题
- 漏掉了行尾的点:原代码里的
i < charArr.length - 1条件,会直接跳过行尾的点(比如你例子里第12、15行末尾的点)——此时i等于数组最后一个索引,这个条件不成立,导致这些明显的格式错误完全没被检测到。 - 条件逻辑覆盖不全:原代码把「点前有空格」和「点后无空格」用
||连在一起,但结合i < charArr.length -1的限制,行尾点前有空格的情况直接被忽略了。 - 错误输出逻辑混乱:你是逐行检查,
errorCount的判断逻辑(if(errorCount >1))会导致单行多个错误时只打印错误信息、不打印原行,这不符合你「在错误行下方打印说明」的需求。
修复后的代码
public static boolean checkLineFormatErrors(String line) { boolean hasFormatError = false; String errorMessage = "One or more dots do not follow the line format for this file."; char[] charArr = line.toCharArray(); for (int i = 0; i < charArr.length; i++) { // 跳过无需校验的列:1-13列(对应数组索引0-12)、77-80列(对应数组索引76及以后) if (i <= 12 || i >= 76) { continue; } if (charArr[i] == '.') { boolean dotError = false; // 检查点前是否有空格(点不在行首时才判断) if (i > 0 && charArr[i-1] == ' ') { dotError = true; } // 检查点后是否无空格:要么点在行尾,要么点后不是空格 if (i == charArr.length - 1 || charArr[i+1] != ' ') { dotError = true; } if (dotError) { hasFormatError = true; // 直接打印原行+错误信息,符合需求 System.out.println(line); System.out.println(errorMessage); // 如果只需要提示一次错误就跳出循环可保留break,否则去掉继续检查所有点 break; } } } return hasFormatError; }
关键修改说明
- 范围判断简化:用
continue直接跳过无需校验的列,逻辑更清晰,避免嵌套条件的混乱。 - 行尾点处理:单独判断
i == charArr.length -1,确保行尾的点也会被检查(规则要求点后必须有空格,行尾的点自然不符合)。 - 错误条件拆分:把「点前有空格」和「点后无空格」的判断分开,确保两种错误场景都被覆盖。
- 输出逻辑修正:只要发现错误就打印原行+错误信息,完全匹配你「在错误行下方打印说明」的需求。
测试验证
针对你给出的测试用例:
00012 ENVIRONMENT DIVISION .
00013 DATA DIVISION.
00014 WORKING-STORAGE SECTION.
00015 77 NUMERO1 PIC 9(2) VALUE ZEROS .
修复后的代码会正确触发错误提示:
- 第12行:点前有空格+点在行尾,触发错误
- 第13行:点后无空格,触发错误
- 第15行:点前有空格,触发错误
而第14行的点符合规则,不会触发错误。
内容的提问来源于stack exchange,提问作者user14258308
相关产品推荐
相关产品推荐

