Ниже приведен код, который я использую для чтения из файла и сохранения деталей из него в 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
Буду признателен за хорошее объяснение вышеуказанной проблемы.
Scanner.next()
по умолчанию считывает слова между пробелами, а не текст между ,
. Я предлагаю вам пройтись по коду в вашем отладчике, чтобы понять, что он делает.
Вы получаете Iphone@28d93b30
, потому что вы печатаете Iphone, и вы не переопределили метод toString()
в классе Iphone, что означает, что выполняется метод Object.toString()
по умолчанию.
Вы получаете исключение, потому что вы пытаетесь получить первый iPad в списке, а его нет в списке. Их нет, потому что вы дважды вызываете next()
(один раз в первом условии if
и один раз во втором условии else if
, поэтому токен, который вы сравниваете с «IPAD», является вторым в строке, а не первый.
Вы только что спасли меня от того, чтобы напечатать это.
Вам нужно переопределить метод
toString()
, чтобы он печатал что-то полезное. Я предлагаю использовать ваш iDE для создания этого метода.