Попытка записи файла в массив - получение исключения NoSuchElementException

(Для этого мне нужно использовать массивы, а не списки массивов. Обрезать код, чтобы упростить отслеживание. Переименование переменных и констант для метки, чтобы другие, кто прочитает это позже, поняли, что я делаю лучше.)

На уровне класса мои массивы определены так:

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)

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

2 ответа

Решение
    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", в результате он получит исключение Array Index Bounds, если его размер превысит 20.

Добавление их в список и преобразование их в массив решит эту проблему. Попробуйте приведенный ниже код.

    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);
    }
Другие вопросы по тегам