-1

Вот сам блок кода:

public User GetUserById(int id) {
    var users = GetUsers();
    return users.stream().filter(x -> x.id == id).findFirst().get();
}

Вот ошибка:

Exception in thread "main" java.lang.NullPointerException: Cannot read field "id" because "x" is null

1 Answers1

1

Если у вас действительно выбрасывается исключение NullPointerException в представленном коде, значит метод GetUsers() возвращает коллекцию, в которой допускаются null-овые элементы, что само по себе указывает на плохой дизайн.

Разумеется, можно добавить проверку и отфильтровать null значения в стриме, но проблема, повторюсь, в том, что используется метод GetUsers(), возвращающий полную коллекцию, которая затем фильтруется:

public User GetUserById(int id) {
    return GetUsers().stream()
            .filter(Objects::nonNull)
            .filter(x -> x.id == id)
            .findFirst()
            .get();
}

Более стандартное решение состоит в применении репозитория, у которого есть отдельные методы для получения полной коллекции findAll и для получения одного элемента по идентификатору findById (в Spring JPA есть также метод findOne), тогда код выглядел бы так:

@Autowired
private UserRepository userRepo;

public List<User> getUsers() { return userRepo.findAll(); }

public User getUserById(int id) { return userRepo.findById(id); }

Nowhere Man
  • 15,995
  • 33
  • 19
  • 29