2012-04-21 94 views
0

我遇到問題,我使用的文本文件有超過一百萬行的數字。數據的格式如下,某些行有3個數據,而其他行只有2個。 每次文件只有2位數據時,它似乎會拋出一個空錯誤(我正在使用Try/catch讀取輸入流)檢查下一個字符串標記器是否爲空

如果我刪除值3 tokenizer然後程序運行到最後。 我是否需要放置if語句來檢查第二行之後是否有另一個標記?如果是這樣 - 怎麼樣?

  while ((getLine = br.readLine()) != null) { 
       StringTokenizer tokenizer = new StringTokenizer(getLine); 
       String Value1 = tokenizer.nextToken(); 
       String Value2 = tokenizer.nextToken(); 
       String Value3 = tokenizer.nextToken(); 
      //Does some more things 
      } 

數據

11  22  33 
    44  55  
    77  88  99 
    10  11 
    13  14 
    16  17  18 
+0

你有沒有試過[Javadoc](http://docs.oracle.com/javase/1.4.2/docs/api/java/util/StringTokenizer.html#hasMoreTokens())?可能不會。無論如何,這些'Scanner'類似乎更時髦。 – 2012-04-21 21:54:51

回答

5

您必須檢查令牌生成器中是否還有令牌。你可以這樣說:

String Value3 = tokenizer.hasMoreTokens() ? tokenizer.nextToken() : null; 

將設置Value3null如果沒有第三個符號。您可能想將其設置爲空字符串。

另一種方法是使用getLine.split("\\s+"),它將返回一個令牌數組。如果只有2個值,則數組的長度爲2.因此,在嘗試讀取可能不存在的第3個值時要小心。

0

如果你試圖調用nextToken第三次,當沒有令牌存在,則返回null。更好的方法是使用String.split,您可以在其中檢查令牌的數量。無論如何,StringTokenizer是遺產。

String[] tokens = getLine.split("\\s+"); 
0

那麼,如何使用這樣的try catch塊呢?

String Value1 = null, Value2 = null, Value3 = null; 

try { 
    Value1 = null; 
    Value2 = null; 
    Value3 = null; 

    Value1 = tokenizer.nextToken(); 
    Value2 = tokenizer.nextToken(); 
    Value3 = tokenizer.nextToken(); 
} catch (NoSuchElementException nse) { 
    // Do Nothing. Just continue.. 
} 
// Does some more things 

System.out.println(Value1 + Value2 + Value3); 

如果沒有讀取任何標記,那麼您將有一個空「值」。

相關問題