首页 > 解决方案 > 指出未满足行格式错误的条件

问题描述

我有一个程序可以读取文件并在每一行中强制执行某种格式。如果一行有格式错误,它会在其下方打印一行,指示它是哪个错误。

对于每一行,从第 1 列到第 13 列和第 77 列到第 80 列,没有强制执行格式规则,所以我不关心这些列中的点。

对于点字符的情况,每个点前面不能有空格,后面必须有空格。

我有一个条件来检查这个,乍一看似乎是对的,但它仍然没有捕捉到点格式的错误。

public static boolean checkLineFormatErrors(String line){
int errorCount;
if(line.contains(".")){ 
                        errorCount = 0;
                        char[] charArr = line.toCharArray();
                        boolean problemWithDot = false;
                        for(int i = 0; i < charArr.length;i++){
                                if(i < charArr.length - 1 
                        && i > 12 && i < 76 
                        && charArr[i] == '.' && (charArr[i-1] == ' ' || charArr[i+1] != ' ')){
                                    problemWithDot = true;
                                    break;
                                }
                            }
                        if(problemWithDot){
                            errorMessage = "One or more dots do not follow the line format for this file.";
                            errorCount++;
                            if(errorCount > 1){
                                System.out.println(errorMessage);
                            } 
                            else{
                                System.out.println(line + errorMessage);
                            }
                        }
                    }
return problemWithDot
}

我所有其他用于捕获其他符号格式错误的方法都有效,只有点方法不起作用。

例如

00012       ENVIRONMENT DIVISION .
00013       DATA DIVISION.
00014       WORKING-STORAGE SECTION.
00015        77 NUMERO1 PIC 9(2) VALUE ZEROS .

第 12 行和第 15 行下面应该有一条错误消息,因为它们的最后一个点前面有一个空格。

(如果您想知道“嘿,最后一段代码不是 Cobol 吗??为什么不添加 cobol 标签?”是的,最后几行是 cobol!这不是 cobol 问题,因为检查错误的程序是仅用 Java 制作。Cobol 只是一种测试文件以强制执行其规则的方法。)

标签: javastringformatstring-formatting

解决方案


通过修复你的循环,它可以工作,主要问题是

i < charArr.length - 1 

dot结束时

for(int i = 12; i < charArr.length && i < 76;i++)
{
    if(charArr[i] == '.' && (charArr[i-1] == ' ' || 
                            charArr[Math.min(charArr.length -1, i+1)] != ' '))
   {
        problemWithDot = true;
        break;
   }
}

笔记

charArr[i+1] != ' '可能会导致问题,因此请检查i + 1不超过数组长度。


推荐阅读