Попытка записи файла в массив - получение исключения 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);
}