1

問題が発生しています。100 万行を超える数値を含むテキスト ファイルを使用しています。データは以下の形式で、一部の行には 3 つのデータがあり、他の行には 2 つしかありません。ファイルが 2 ビットのみのデータに到達するたびに、null エラーがスローされるようです (私は Try/catch を使用して入力ストリームを読み取ります)

値 3 のトークナイザーを削除すると、プログラムは最後まで実行されます。2 行目以降に別のトークンがあるかどうかを確認するために、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;

3 番目のトークンがない場合に設定さValue3れます。null代わりに、空の文字列に設定することをお勧めします。

getLine.split("\\s+")別の方法は、トークンの配列を返すを使用することです。値が 2 つしかない場合、配列の長さは 2 になります。そのため、存在しない可能性がある 3 番目の値を読み取ろうとするときは注意してください。

于 2012-04-21T21:53:45.003 に答える
0

nextTokenトークンが存在しない場合に 3 回目の呼び出しを試みると、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);

トークンがまったく読み取られない場合、null の「値」が表示されます。

于 2012-04-21T21:58:43.977 に答える