Пара проблем:
- Вы увеличиваете j в обоих тестах "если". Я не проверял, чтобы быть уверенным (это довольно запутанный код, если честно), но если вы убедитесь, что увеличиваете j, только когда нашли совпадение, это поможет.
- Ваш тест с использованием
i
в основном означает, что он будет пытаться прочитать столько файлов, сколько строк в файле, чем останавливаться, когда вы достигнете конца файла. В основном вам не нужно i
здесь.
Вот одна измененная версия:
while (j < autos.length) {
if (vehicle.equalsIgnoreCase(autos[j])) {
j++;
Vehicle v = new Vehicle();
v.setOwnerName(autos[j++]);
allVehicles.add(v);
} else if(car.equalsIgnoreCase(autos[j])){
j++;
Car c = new Car();
c.setOwnerName(autos[j++]);
allVehicles.add(c);
}
}
Было бы немного чище извлечь тип, хотя - тогда вы можете сделать сравнения отдельно:
while (j < autos.length) {
String type = autos[j++];
if (vehicle.equalsIgnoreCase(type)) {
Vehicle v = new Vehicle();
v.setOwnerName(autos[j++]);
allVehicles.add(v);
} else if(car.equalsIgnoreCase(type)){
Car c = new Car();
c.setOwnerName(autos[j++]);
allVehicles.add(c);
}
}
Это все еще не совсем то, как я это сделаю, но это ближе ...
Следующим моим шагом будет более правильное использование сканера:
while (scanner.hasNext()) {
String type = scanner.nextLine();
if (type.equalsIgnoreCase("vehicle")) {
allVehicles.add(new Vehicle(scanner));
} else if (type.equalsIgnoreCase("car")) {
allVehicles.add(new Car(scanner));
}
// ...
}
Затем заставьте конструктор для Vehicle, Car и т. Д. Выполнять синтаксический анализ непосредственно из сканера.
Следующим шагом будет отделение конструкции от итерации. Введите новый метод:
// Use a base type in real code
private static Object parseNextVehicle(Scanner scanner) {
String type = scanner.nextLine();
if (type.equalsIgnoreCase("vehicle")) {
return new Vehicle(scanner);
} else if (type.equalsIgnoreCase("car")) {
return new Car(scanner);
}
// ... throw an exception indicating an unknown vehicle type
}
// ... and then in the main method, use it like this:
while (scanner.hasNextLine()) {
allVehicles.add(parseNextVehicle(scanner));
}