NoSuchElementException 在 - Java

NoSuchElementException in - 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)

据我所知,您的代码存在 2 个问题:

  • 您忘记检查第二个 Scanner s2hasNextLine()
    使用 Scanner 时,您需要检查下一行是否有 hasNextLine(),它将 return null at EOF.
  • 您可能希望在 while 循环中使用 s.nextLine() 而不是 s.next(),因为您正在检查 while (s1.hasNextLine())。一般来说,您必须将您的.hasNext...与您的.next...相匹配。

对于您在 readString 中遇到的特定异常:

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

您需要在循环守卫中调用 s.hasNext(),或者在正文中使用 s.nextLine()

所述。

您的文件末尾有一个额外的换行符。

hasNextLine() 检查缓冲区中是否有另一个 linePattern。 hasNext() 检查缓冲区中是否有可解析的标记,由扫描器的定界符分隔。

您应该将您的代码修改为以下之一

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

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