Поле computers не инициализировано, поэтому первый sellComputer() выбросит NullPointerException на size(). Метод buyComputers пуст и не пополняет запас; Runner покупку товара до продажи не выполняет.
Обнаружить дефекты в коде без выполнения класса Runner
Поле computers не инициализировано, поэтому первый sellComputer() выбросит NullPointerException на size(). Метод buyComputers пуст и не пополняет запас; Runner покупку товара до продажи не выполняет.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В проекте присутствуют два класса — Runner и ComputerShop. Требуется проанализировать их исходники и выявить потенциальные проблемы, не запуская метод main класса Runner.
public class Runner {
public static void main(String[] args) {
ComputerShop computerShop = new ComputerShop();
PhoneShop phoneShop = new PhoneShop();
Computer computer = computerShop.sellComputer();
Phone phone = phoneShop.sellPhone();
computer.start();
phone.call();
}
}
public class ComputerShop {
private List<Computer> computers;
public void buyComputers(List<Computer> computers) {
}
public Computer sellComputer() {
if (computers.size() == 0) {
throw new RuntimeException("Компьютеры проданы!");
}
return computers.remove(0);
}
}
Ответ
Поле computers не инициализировано, поэтому первый sellComputer() выбросит NullPointerException на size(). Метод buyComputers пуст и не пополняет запас; Runner покупку товара до продажи не выполняет.
Инициализируйте внутреннюю коллекцию в конструкторе или поле, а buyComputers реализуйте через проверку входа и добавление элементов, без сохранения чужого изменяемого списка. Пустой магазин должен возвращать явно оговорённую ошибку отсутствия товара, а не null. Для FIFO-продаж удобна ArrayDeque, поскольку удаление начала ArrayList сдвигает остальные элементы. PhoneShop, Computer и Phone в условии не показаны, поэтому конкретные дефекты их методов установить нельзя. Потокобезопасность нужна лишь при конкурентном доступе.