NoSuchElementException в — Java

Я пытаюсь прочитать данные из текстового файла, а затем сохранить их в массив. Я предполагаю, что в строке одно слово. Я получаю NoSuchElementException здесь:

while (s.hasNextLine()) 
       {
           text = text + s.next() + " ";
       }

Это мой код:

public class ReadNote 
{
   public static void main(String[]args) 
   { 


      String text = readString("CountryList.txt");
      System.out.println(text);

      String[] words = readArray("CountryList.txt");

      for (int i = 0; i < words.length; i++) 
      {
         System.out.println(words[i]);
      }
}


  public static String readString(String file) 
  {

       String text = "";

       try{
       Scanner s = new Scanner(new File(file));

       while (s.hasNextLine()) 
       {
           text = text + s.next() + " ";
       }

         } catch(FileNotFoundException e) 
           {
              System.out.println("file not found ");
           }
        return text;
   }


  public static String[] readArray(String file) 
  { 
      int ctr = 0;

       try {
       Scanner s1 = new Scanner(new File(file));

       while (s1.hasNextLine()) 
       {
            ctr = ctr+1;
            s1.next();
       }

       String[] words = new String[ctr];
       Scanner s2 = new Scanner(new File(file));

       for ( int i = 0; i < ctr; i++) 
       {
           words [i] = s2.next();
       }

        return words;

    } catch (FileNotFoundException e) { }
        return null;
 }
}

Вот сообщение.

    Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:862)
    at java.util.Scanner.next(Scanner.java:1371)
    at ReadNote.readString(ReadNote.java:29)
    at ReadNote.main(ReadNote.java:13)

person Lora Gonzales    schedule 29.01.2016    source источник
comment
Можете ли вы разобраться со своим отступом, пожалуйста?   -  person khelwood    schedule 29.01.2016
comment
Возможный дубликат Java Scanner hasNextLine NoSuchElementException?   -  person Andy Turner    schedule 29.01.2016
comment
@khelwood Извините за это, исправлено.   -  person Lora Gonzales    schedule 29.01.2016


Ответы (3)


Для конкретного исключения, которое вы получаете в readString:

while (s.hasNextLine()) {
  text = text + s.next() + " ";
}

Вам нужно либо вызвать s.hasNext() в защите от цикла, либо использовать s.nextLine() в теле.

person Andy Turner    schedule 29.01.2016
comment
Спасибо, я только что изменил это, и это сработало. У вас есть идеи о том, как я могу хранить его в поле со списком? - person Lora Gonzales; 29.01.2016
comment
Предполагая, что вы имеете в виду JComboBox, создайте его экземпляр, а затем вызовите addItem. - person Andy Turner; 29.01.2016

Как описано в этом ответе.

У вас есть одна дополнительная новая строка в конце вашего файла.

hasNextLine() проверяет, есть ли в буфере другой linePattern. hasNext() проверяет, есть ли в буфере анализируемый токен, разделенный разделителем сканера.

Вы должны изменить свой код на один из следующих

while (s.hasNext()) {
    text = text + s.next() + " ";
}

while (s.hasNextLine()) {
    text = text + s.nextLine() + " ";
}
person DominicEU    schedule 29.01.2016

Насколько я могу судить, в вашем коде есть 2 проблемы:

  • Вы забыли проверить hasNextLine() для второго Scanner s2.
    При использовании Scanner вам нужно проверить, есть ли следующая строка с hasNextLine(), и она вернет null в EOF.
  • Вы, вероятно, хотите s.nextLine() вместо s.next() в цикле while, так как вы проверяете while (s1.hasNextLine()). Как правило, вы должны сопоставлять свои .hasNext... с вашими .next....
person Idos    schedule 29.01.2016