2012-04-21 3 views
0

У меня проблема, я использую текстовый файл, который содержит более миллиона строк чисел. данные находятся в формате ниже, некоторые строки имеют 3 части данных, в то время как другие имеют только 2. Каждый раз, когда файл попадает на данные только с двумя битами, он, кажется, бросает нулевую ошибку (я использую Try/catch для чтения входного потока)проверить, не указан ли следующий токенизатор String

Если я удаляю значение 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 
+0

Вы случайно попробовали [Javadoc] (http://docs.oracle.com/javase/1.4.2/docs/api/java/util/StringTokenizer.html#hasMoreTokens())? Думаю нет. Во всяком случае, теперь класс «Сканер» выглядит более модным. –

ответ

5

Вам нужно будет проверить наличие еще токенов в токенизаторе. Вы можете сделать это следующим образом:

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

Который установит Value3 к null, если нет третьих маркеров. Вместо этого вы можете установить его в пустую строку.

Альтернативой является использование getLine.split("\\s+"), которое вернет массив токенов. Если есть только 2 значения, массив будет иметь длину 2. Поэтому будьте осторожны при попытке прочитать третье значение, которое может отсутствовать.

0

Если попытаться назвать nextToken в третий раз, когда маркер не существует, она возвращает нуль. Лучше всего использовать String.split, где вы можете проверить количество токенов. StringTokenizer - это наследие в любом случае.

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

Ну, как насчет использования блока catch 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); 

У вас будет нулевое значение, если вообще нет токена.

Смежные вопросы