Почему компилятор выдаёт ошибку "Result of 'list.isEmpty()' is always 'true'"?
Еще во время компиляции идея пишет:
Result of 'list.isEmpty()' is always 'true'
Не могу ничего положить в массив, ну и вынуть тоже. При выборе case 0 программа не завершается. Что не так?
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
while (true) {
System.out.println();
System.out.print("Выберите операцию: \n 0. Выход из программы\n 1. Добавить дело\n 2. Показать дела\n 3. Удалить дело по номеру\n 4. Удалить дело по названию\n");
choose();
}
}
public static void choose () {
List<String> list = new ArrayList<>();
Scanner scanner = new Scanner(System.in);
String number = scanner.nextLine();
int choice = Integer.parseInt(number);
switch (choice) {
case 0:
System.out.println("Программа завершена!");
return;
case 1:
System.out.print("Введите название задачи: ");
list.add(scanner.nextLine());
break;
case 2:
if (list.isEmpty()) {
System.out.println("Список пуст!");
} else {
for (int i = 0; i < list.size(); i++) {
System.out.println((i + 1) + ". " + list.get(i));
}
}
break;
case 3:
System.out.print("Введите номер для удаления: ");
int check = Integer.parseInt(scanner.nextLine());
if (check > list.size()) {
System.out.println("Нет дела под таким номером");
} else {
list.remove(check - 1);
}
break;
case 4:
System.out.print("Введитие название дела для удаления:");
String deal = scanner.nextLine();
list.remove(deal);
break;
}
}
}
Ответы (1 шт):
Почему список всегда пустой?
Просто потому что.... Вы его не заполняете!
Ваш ArrayList объявлен внутри метода. И каждый раз при вызове метода choice() он будет заново создаваться. (Если вам кажется это странным, то почитайте про локальные переменные, то есть переменные, которые объявлены внутри метода).
А внутри метода он тоже нигде не заполнится, если не выполниться case 1. А проверка на пустоту происходит в case 2, то есть в случае проверки на пустоту case 1 точно не выполнилось (в switch может выполниться только один case). А до этого ArrayList был пустой. То есть в случае выполнения case 2 непустым ArrayList быть не может - вот компилятор вам об этом и говорит.
Более наглядное представление происходящего
Попробую представить происходящее в методе более наглядно. В методе choice() происходит вот что:
Создаётся новый (пустой)
ArrayList;Пользователь ввёл...
0 -> выход из метода;
1 -> добавляется элемент в ваш
ArrayList. И происходит выход, ведь в методе послеswitchничего нет;2 -> если
ArrayListне пустой, то производиться вывод всех его элементов. Но он всегда пустой, такcase 1не выполнилось, аArrayListобъявлен внутри метода и при каждом вызове метода он будет пересоздаваться;3 -> удаляете какой-то индекс из
ArrayList'а. НоArrayListпустой, так что всегда будет выводиться "Нет дела под таким номером";4 -> практически тоже самое, что и в
case 3;
Происходит выход из метода, и ваш
ArrayListперестаёт существовать. В случае повторного вызова метода он будет создан заново (будет пустой).
Как исправить
Вынесите ArrayList в поле класса. Только не забывайте, что choice() - статический метод, и если вы из статического метода будете пытаться получить доступ к нестатическому полю, то у вас не получиться это сделать. Либо делайте и поле, и метод static, либо и то, и то нестатическим, либо поле static а метод - нестатическим.