2012-09-10 82 views
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(); } 
} 

我想知道是否有使用這種方法的任何嚴重缺陷。它不需要是生產質量。

此外,有沒有標準的方法來解析這樣的字符串?

編輯:我們可以假設文本文件格式完美。但是我看到了解決可能的例外的重要性。

+0

它似乎最不好的方面來自不處理可能的錯誤。我的問題更多的是我解析整數的方式。 – James

回答

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()兩次爲每一行。

+0

感謝您使用scan.nextInt()函數。這更符合我期待的內容! – James

0

根據我這個程序有三個缺陷。

  1. 分隔符;什麼,如果有分隔符意外刪除或意外增加
  2. 應該有檢查explodedLogLine這是長度2的,它不是null否則會導致意外的運行時錯誤
  3. 你應該抓住NumberFormatException格式異常,因爲你永遠無法確定該輸入始終是一個數

一個簡單的例子下面讓你知道事情會出錯。

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

此代碼將在你的程序將產生NumberFormatException作爲""字符串不能被解析爲整數這種情況下打印[3, , 3]

相關問題