Почему компилятор выдаёт ошибку "Result of 'list.isEmpty()' is always 'true'"?

Рейтинг: 0Ответов: 1Опубликовано: 27.03.2023

Еще во время компиляции идея пишет:

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;
        }
    }
}

Ответы

▲ 2Принят

Почему список всегда пустой?

Просто потому что.... Вы его не заполняете! Ваш ArrayList объявлен внутри метода. И каждый раз при вызове метода choice() он будет заново создаваться. (Если вам кажется это странным, то почитайте про локальные переменные, то есть переменные, которые объявлены внутри метода).

А внутри метода он тоже нигде не заполнится, если не выполниться case 1. А проверка на пустоту происходит в case 2, то есть в случае проверки на пустоту case 1 точно не выполнилось (в switch может выполниться только один case). А до этого ArrayList был пустой. То есть в случае выполнения case 2 непустым ArrayList быть не может - вот компилятор вам об этом и говорит.

Более наглядное представление происходящего

Попробую представить происходящее в методе более наглядно. В методе choice() происходит вот что:

  1. Создаётся новый (пустой) ArrayList;

  2. Пользователь ввёл...

    • 0 -> выход из метода;

    • 1 -> добавляется элемент в ваш ArrayList. И происходит выход, ведь в методе после switch ничего нет;

    • 2 -> если ArrayList не пустой, то производиться вывод всех его элементов. Но он всегда пустой, так case 1 не выполнилось, а ArrayList объявлен внутри метода и при каждом вызове метода он будет пересоздаваться;

    • 3 -> удаляете какой-то индекс из ArrayList'а. Но ArrayList пустой, так что всегда будет выводиться "Нет дела под таким номером";

    • 4 -> практически тоже самое, что и в case 3;

  3. Происходит выход из метода, и ваш ArrayList перестаёт существовать. В случае повторного вызова метода он будет создан заново (будет пустой).

Как исправить

Вынесите ArrayList в поле класса. Только не забывайте, что choice() - статический метод, и если вы из статического метода будете пытаться получить доступ к нестатическому полю, то у вас не получиться это сделать. Либо делайте и поле, и метод static, либо и то, и то нестатическим, либо поле static а метод - нестатическим.