Я пытаюсь прочитать текстовый файл и сохранить данные в Arraylist, но методы чтения сканера имеют ошибку закрытого сканера - PullRequest
1 голос
/ 04 мая 2020

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

public class Test {
  private static List<City> cities;

    public static void main(String[] args) {
        readFile("res/data.txt");// TODO code application logic here
    }
    public static void readFile(String filename){
     try {
            Scanner sc = new Scanner(new File(filename));
            cities = new ArrayList<City>();
            while (sc.hasNext()) {
                cities.add(new City(sc.nextInt(),sc.nextInt(),sc.nextInt()));
              sc.close();
            }          
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

Ответы [ 4 ]

1 голос
/ 04 мая 2020

Вы должны переместить эту строку

sc.close();

за пределы времени l oop, поэтому

public class Test {
  private static List<City> cities;

    public static void main(String[] args) {
        readFile("res/data.txt");// TODO code application logic here
    }
    public static void readFile(String filename){
     try {
            Scanner sc = new Scanner(new File(filename));
            cities = new ArrayList<City>();
            while (sc.hasNext()) {
                cities.add(new City(sc.nextInt(),sc.nextInt(),sc.nextInt()));
            } 
            sc.close();         
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }
0 голосов
/ 04 мая 2020

Переместить sc.close(); вне времени l oop.

0 голосов
/ 04 мая 2020

Ваш sc.close() вызов является последним оператором в while l oop. Переместите его после }. Но , если есть исключение, ваш текущий код пропускает дескриптор файла. Это не хорошо. Лучше переместить вызов close в блок finally. Еще лучше, они добавили try-with-Resources, потому что это громоздко (и правильно обращаться с близким трудно). Чтобы использовать это, это было бы что-то вроде

public static void readFile(String filename){
    try (Scanner sc = new Scanner(new File(filename))) {
        cities = new ArrayList<>(); // Diamond Operator
        while (sc.hasNext()) {
            cities.add(new City(sc.nextInt(),sc.nextInt(),sc.nextInt()));
        }          
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }
}
0 голосов
/ 04 мая 2020

Есть очевидная ошибка. Вы звоните sc.close() на все oop. Так что будет прочитана только первая строка. Вы должны переместиться на sc.close() после while l oop. Надеюсь, это поможет

...