0

我的程序从带有格式的纯文本文件中读取行:<integer>;<integer>%n;分隔符在哪里。它将两个解析的整数与其他 2 个已知值进行比较,tallyArray[i]如果它们匹配则递增。

我目前使用:

try {
    scan = new Scanner(new BufferedReader(new FileReader("LogFileToBeRead.txt")));

    for (int i = 0; i < tallyArraySize; i++) {
        explodedLogLine = scan.nextLine().split(";");

        if (IntReferenceVal1 == Integer.parseInt(explodedLogLine[0]) && IntReferenceVal2 == Integer.parseInt(explodedLogLine[1])) {
           tallyArray[i]++;
        }
    }
} finally {
    if (scan != null) { scan.close(); }
}

我想知道这种方法是否有任何严重的错误。它不需要是生产质量的。

另外,有没有像这样解析字符串的标准方法?

编辑:我们可以假设文本文件格式完美。但我看到了考虑可能的例外情况的重要性。

4

2 回答 2

0

据我所知,该程序存在三个缺陷。

  1. 分隔符;如果有分隔符被意外删除或意外添加怎么办
  2. 应该检查explodedLogLine它是否有长度2null否则会导致意外的运行时错误
  3. 您应该捕获NumberFormatException格式异常,因为您永远无法确定 Input 始终是数字

下面的一个简单说明让您了解事情将如何出错。

    String str = "3;;3";
    System.out.println(Arrays.toString(str.split(";")));

此代码将在这种情况下打印,因为[3, , 3]您的程序将生成字符串无法解析为整数。NumberFormatException""

于 2012-09-10T05:35:35.347 回答
0

您没有处理方法调用NumberFormatExceptions引发的问题。Integer.parseInt()如果有一行错误,则执行退出您的 for 循环。

您没有审查正在读取的文件的完整性。如果没有;字符或者字符串实际上不是数字,则执行只会退出您发布的代码块。


如果您可以假设文件格式完美,并且您准备使用扫描仪,则可以将;分隔符添加到扫描仪:

scan = new Scanner(new BufferedReader(new FileReader("LogFileToBeRead.txt")));
scan.useDelimiter(Pattern.compile("(;|\\s)"));

for (int i = 0; i < tallyArraySize; i++) {
    int ref1 = scan.nextInt();
    int ref2 = scan.nextInt();

    if (IntReferenceVal1 == ref1 && 
        IntReferenceVal2 == ref2) {
       tallyArray[i]++;
    }
}

只需Scanner.nextInt()为每条线路调用两次。

于 2012-09-10T05:35:43.273 回答