当前位置: 代码迷 >> java >> 尝试将文件写入数组-获取NoSuchElementException
  详细解决方案

尝试将文件写入数组-获取NoSuchElementException

热度:111   发布时间:2023-07-18 08:52:14.0

(为此,我需要使用数组-而不是数组列表。通过剪接代码可以使其更容易理解。重命名变量和常量以进行标记,以便以后阅读本文的其他人了解我在做什么。)

在类级别,我的数组定义如下:

private static final int CONSTANT = 20;
public static String[] arrayName = new String[CONSTANT - 1];

在主要方法中,我指向的方法如下:

readArrays("filenName.txt", arrayName);

并且类似这样的行指向发生错误的以下完整方法:

    public static void readArrays(String codeFile, 
                                 String[] Arrays)
 {        

   try ( Scanner fin = new Scanner ( new File(codeFile) ); ) 
    {
     for (int i = 0; i < CONSTANT - 1; i++) 
          {
          Arrays[i] = fin.next();
          }
    }
    catch (FileNotFoundException e) 
    {
        System.err.println( "Read Error: " + e.getMessage() );
    }

它在NetBeans中没有显示任何错误,但是在控制台窗口中,确切的错误消息是:

 run:
 Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:862)
    at java.util.Scanner.next(Scanner.java:1371)
    at mp06.Main.readArrays(Main.java:47)
    at mp06.Main.main(Main.java:33)
 Java Result: 1
 BUILD SUCCESSFUL (total time: 0 seconds)

是什么导致此错误? 最终,我的目标是使用相同的方法,而不使用任何其他方法,将多个文本文件的全部内容写入多个数组。

    try ( Scanner fin = new Scanner ( new File(codeFile) ); ) 
    {
     for (int i = 0; i < CONSTANT - 1 && fin.hasNext(); i++) 
          {
          Arrays[i] = fin.next();
          }
    }
    catch (FileNotFoundException e) 
    {
        System.err.println( "Read Error: " + e.getMessage() );
    }

您还需要检查下一个扫描仪

Java8中 ,您可以使用来读取文件:

List<String> contents = Files.lines(Paths.get("filenName.txt")).collect(Collectors.toList());

以下代码可能会对您有所帮助。 有几件事情,您必须在调用next()之前检查扫描程序中是否存在下一个元素,而另一个是常量“ 20”,如果大小超过20,它将以Array Index Bounds异常结束。

将它们添加到列表中并将其转换为数组将解决此问题。 试试下面的代码。

    List<String> list = new ArrayList<String>(); 
    while (fin.hasNext()) {
        list.add(fin.next());
    }

    String[] array = new String[list.size()];
    list.toArray(array);

    for (String str: array) {
        System.out.println(str);
    }