Почему чтение из файла и сохранение деталей в классах предоставляют значения мусора?

Ниже приведен код, который я использую для чтения из файла и сохранения деталей из него в ArrayList двух классов Iphone и Ipad, но, видимо, с этим что-то не так.

Результат, который я получаю для этого кода:

Iphone@28d93b30 and IndexOutOfBoundException for ipads.get(0)

try {
            fScanner = new Scanner(new File("apple.txt"));
        } 
        catch (FileNotFoundException e) {
            System.out.println(e.toString());
        }

        ArrayList<Iphone> iphones = new ArrayList<>();
        ArrayList<Ipad> ipads = new ArrayList<>();

        while(fScanner.hasNextLine()) {
            String line = fScanner.nextLine();
            Scanner lineScanner = new Scanner(line);

            if (lineScanner.next().equals("IPHONE")) {

                    String model = "IPHONE"+lineScanner.useDelimiter(",").next();
                    String scrSze = lineScanner.useDelimiter(",").next();
                    String proc = lineScanner.useDelimiter(",").next();
                    String simT = lineScanner.useDelimiter(",").next();
                    String clr = lineScanner.useDelimiter(",").next();
                    String rom = lineScanner.useDelimiter(",").next();
                    String is3dtouch = lineScanner.useDelimiter(",").next();
                    String pric = lineScanner.useDelimiter(",").next();

                    iphones.add(new Iphone(model,scrSze,proc,simT,clr,rom,is3dtouch,pric)); 

            }


            else if (lineScanner.next().equals("IPAD")) {

                    String model = "IPAD"+lineScanner.useDelimiter(",").next();
                    String scrSze = lineScanner.useDelimiter(",").next();
                    String proc = lineScanner.useDelimiter(",").next();
                    String iswifi = lineScanner.useDelimiter(",").next();
                    String clr = lineScanner.useDelimiter(",").next();
                    String memo = lineScanner.useDelimiter(",").next();
                    String pric = lineScanner.useDelimiter(",").next();

                    ipads.add(new Ipad(model,scrSze,proc,iswifi,clr,memo,pric));

            }

        }

        System.out.println(iphones.get(2)+"\n");
        System.out.println(ipads.get(0)+"\n");

Файл такой:

IPHONE 7, 4.7, A10, GSM, JET BLACK, 32GB, TRUE, 700
IPAD AIR 2, 9.7, A8, TRUE, SILVER, 64GB, 400
IPHONE SE, 4, A9, CDMA, SILVER, 16GB, FALSE, 490
IPAD PRO, 9.7, A9, TRUE, SPACE GREY, 32GB, 650
IPHONE X, 7, A11, LTE, BLACK, 128GB, TRUE, 999
IPAD PRO X, 12, A12, TRUE, SPACE GREY, 256GB, 700

Буду признателен за хорошее объяснение вышеуказанной проблемы.

Вам нужно переопределить метод toString(), чтобы он печатал что-то полезное. Я предлагаю использовать ваш iDE для создания этого метода.

Peter Lawrey 27.10.2018 13:43
Scanner.next() по умолчанию считывает слова между пробелами, а не текст между ,. Я предлагаю вам пройтись по коду в вашем отладчике, чтобы понять, что он делает.
Peter Lawrey 27.10.2018 13:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы получаете Iphone@28d93b30, потому что вы печатаете Iphone, и вы не переопределили метод toString() в классе Iphone, что означает, что выполняется метод Object.toString() по умолчанию.

Вы получаете исключение, потому что вы пытаетесь получить первый iPad в списке, а его нет в списке. Их нет, потому что вы дважды вызываете next() (один раз в первом условии if и один раз во втором условии else if, поэтому токен, который вы сравниваете с «IPAD», является вторым в строке, а не первый.

Вы только что спасли меня от того, чтобы напечатать это.

JoeHz 27.10.2018 13:44

Другие вопросы по теме