2012-04-21 63 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); 

如果没有读取任何标记,那么您将有一个空“值”。

相关问题