1

我遇到了问题,我正在使用一个包含超过一百万行数字的文本文件。数据格式如下,有些行有 3 条数据,而另一些只有 2 条数据。每次文件获取只有 2 位的数据时,似乎都会抛出空错误(我正在使用 Try/catch读取输入流)

如果我删除值 3 标记器,那么程序将运行到最后。我是否需要添加一个 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
4

3 回答 3

6

您必须检查标记器中是否仍有标记。你可以这样做:

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

如果没有第三个令牌,它将设置Value3为。null您可能希望将其设置为空字符串。

另一种方法是使用getLine.split("\\s+"),它将返回一个标记数组。如果只有 2 个值,则数组的长度为 2。因此,尝试读取可能不存在的第三个值时要小心。

于 2012-04-21T21:53:45.003 回答
0

如果您尝试nextToken第三次调用,则当不存在令牌时,它会返回 null。更好的做法是使用String.split,您可以在其中检查令牌的数量。StringTokenizer无论如何都是遗产。

String[] tokens = getLine.split("\\s+");
于 2012-04-21T21:52:43.483 回答
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);

如果根本没有读取任何标记,您将拥有一个空的“值”。

于 2012-04-21T21:58:43.977 回答