2015-06-07 6 views
1

Я недавно делал простой проект по чтению, записи и сопоставлению строки в ядре Java. Я использовал StringTokenizer для анализа каждого элемента в строке. но при этом я вижу следующее сообщение об ошибке. Любая помощь относительно этого, спасибо заранее. сообщение Ошибка:java.util.NoSuchElementException при использовании StringTokenizer в java

Exception in thread "main" java.util.NoSuchElementException 
at java.util.StringTokenizer.nextToken(Unknown Source) 
at java.util.StringTokenizer.nextElement(Unknown Source) 
at com.dhiraj.demo.ComparatorClass.main(ComparatorClass.java:64) 

Мой код как следующий;

String listtable = "listtable.dat"; 
    ArrayList<ListTableClass> ltc = new ArrayList<ListTableClass>(); 

    try(FileInputStream fis = new FileInputStream(listtable); 
      BufferedReader bio = new BufferedReader(new InputStreamReader(fis))){ 
     String line; 
     while((line = bio.readLine())!=null){ 
      System.out.println(line); 
      StringTokenizer to = new StringTokenizer(line, "|"); 
      //while(tokens.hasMoreElements()){ 
       //System.out.println(tokens.nextElement()); 

       //Integer id = Integer.parseInt(to.nextElement().toString().trim()); 
      // System.out.println(id); 
       Integer id = Integer.parseInt(to.nextElement().toString()); 

       //int id = Integer.parseInt(to.nextElement().toString().trim()); 
       System.out.println("i am error"); 
       String fname = to.nextElement().toString().trim(); 
       String lname = to.nextElement().toString().trim(); 
       String address = to.nextElement().toString().trim(); 
       Integer age = Integer.parseInt(to.nextElement().toString().trim()); 


       ltc.add(new ListTableClass(id, fname, lname, address, age)); 

      //} 
     } 
    }catch(IOException e){ 
     System.out.println(e); 

    }  
    for(ListTableClass t: ltc){ 
     System.out.println(t.getId()); 
     System.out.println(t.getFname()); 
     System.out.println(t.getLname()); 
     System.out.println(t.getAddress());  
     System.out.println(t.getAge());   

    } 

и образец файла:

11120|bijaya|khanal|biratnagar|25 
11121|chandramani|sapkota|hetauda|25 
11117|Hari|Sapkota|bhaktapur|25 
11118|pramod|chaulagain|banepa|25 
11119|bigyan|shrestha|birjung|25 
11120|bijaya|khanal|biratnagar|25 
11114|suman|hamal|shangrila|25 
11115|kishor|Neupane|Sanepa|25 
+1

Вы говорите, что ваш пример кода выше воспроизводит ошибку? Потому что я просто копировал код в свой код и отлично его запускал. Нет ошибок. Убедитесь, что вы предоставили нам код, который воспроизводит ошибку. Кроме того, рекомендуется использовать 'String.split()' в пользу 'StringTokenizer'. Гораздо проще в использовании. – sstan

+0

Да, это вызывает ошибку в моей среде IDE. Может быть, потому, что я сделал тот же процесс для другого файла. –

+0

так происходит ошибка с данными образца, которые вы предоставили? Или это происходит только с разными данными? Потому что, опять же, я не могу получить вашу ошибку с предоставленной вами информацией. – sstan

ответ

1

Я хотел бы начать с добавлением toString к ListTableClass, что-то вроде

public String toString() { 
    return String.format("Id: %d%n" + // 
      "Name (lname, fname): %s, %s%n" + // 
      "Address: %s%n" + // 
      "Age: %d",// 
      id, lname, fname, address, age// 
      ); 
} 

Тогда я предпочел бы String.split(String) и Scanner и читать файл из домашней папки пользователя и, наконец, запрограммировать интерфейс List (и использовать алмазный оператор <>) с toString и вы, вероятно, следует проверить на линии, как пуста

public static void main(String[] args) { 
    String listtable = "listtable.dat"; 
    List<ListTableClass> ltc = new ArrayList<>(); 
    File f = new File(System.getProperty("user.home"), listtable); 
    try (Scanner s = new Scanner(f)) { 
     while (s.hasNextLine()) { 
      String line = s.nextLine(); 
      if (line.trim().isEmpty()) { 
       continue; 
      } 
      System.out.println(line); 
      String[] to = line.split("|"); 
      Integer id = Integer.parseInt(to[0].trim()); 
      String fname = to[1].trim(); 
      String lname = to[2].trim(); 
      String address = to[3].trim(); 
      Integer age = Integer.parseInt(to[4].trim()); 
      ltc.add(new ListTableClass(id, fname, lname, address, age)); 
     } 
    } catch (IOException e) { 
     System.out.println("Caught Exception: " + e.getMessage()); 
     e.printStackTrace(); 
    } 
    for (ListTableClass t : ltc) { 
     System.out.println(t); 
    } 
} 
+0

Спасибо, что это сработало. –