Как обрабатывать возвращаемое значение, когда объект не найден - PullRequest
2 голосов
/ 15 января 2020

У меня есть следующий фрагмент кода, он предназначен для поиска и возврата объекта продукта с использованием строкового ввода для сравнения с именами всех продуктов.

public Product find(String input){

    for(int i = 0; i <Products.size();i++)
    {
         if(input ==Products.get(i).getName()){

         return Products.get(i);
        }   
    }   
}

У меня две проблемы с этим.

A) Возвращаемое значение находится внутри оператора IF, поэтому основной метод find () не имеет возвращаемого значения. поэтому я получаю сообщение об ошибке по этому поводу.

B) Если пользователь вводит имя продукта, который не существует, то продукт не будет найден, в котором он ничего не должен возвращать, но Я не уверен, как это сделать. В настоящее время результат используется для удаления продуктов, поэтому, если он пропускает нулевой объект продукта для удаления, это, вероятно, приведет к ошибке вывода в методе удаления.

Я новичок в программировании, поэтому приношу свои извинения, если это вопрос новичка, любая помощь будет очень цениться.

Ответы [ 3 ]

6 голосов
/ 15 января 2020

(A) и (B) - это действительно одна и та же проблема. : -)

Вам необходимо иметь код после l oop, который выполняет одно из двух действий, когда совпадений не найдено:

  1. Выдает исключение или

  2. Возвращает null

... или возвращает Optional как Андреас показывает вам в своем ответе .

Возвращение null является стандартным, если поиск совпадений не является распространенным явлением. Выдача исключения является стандартной, если обнаружение совпадения является необычным и неожиданным.


Несколько других замечаний по этому коду:

  1. Не использовать == для сравнения строк используйте equals; детали

  2. Я предполагаю, что Products является либо переменной экземпляра (полем), либо переменной stati c. Если так, это не должно быть первоначально ограничено. Стандартные Java соглашения об именах имеют переменные instance и stati c, начинающиеся со строчной буквы.

  3. Если Products является переменной экземпляра, я настоятельно рекомендую использовать this. для получить к нему доступ (this.Products, а не только Products), хотя это вопрос стиля; Java позволяет разрешить его отключение.

  4. Если Products является массивом или List (учитывая метод size(), он выглядит как список), вам, вероятно, будет лучше использовать расширенные for l oop.

  5. Чрезмерное использование пустых строк не рекомендуется. Опять же, просто вопрос стиля. : -)

  6. Лучше всего согласовывать ваше размещение фигурных скобок ({}) (в конце строки или самостоятельно на следующей строке, но не оба в одном коде). : -)

Принимая во внимание все вышеперечисленное, предполагая, что Products является переменной экземпляра:

public Product find(String input) {
    for (Product product : this.products) {
        if (input.equals(product.getName())) {
            return product;
        }   
    }   
    return null;
}
1 голос
/ 15 января 2020

Рекомендованный способ ничего не возвращать, начиная с Java 8, это возвращать Optional:

public Optional<Product> find(String input) {
    for (Product product : products) {
        if (product.getName().equals(input)) {
            return Optional.of(product);
        }
    }
    return Optional.empty();
}

Это заставляет звонящего проверить, было ли что-то возвращено .

Для получения дополнительной информации см., Например, Справочник по Java 8 Необязательный .


Для предварительного Java 8 или просто для старого -стиль, вернуть значение null:

public Product find(String input) {
    for (Product product : products) {
        if (product.getName().equals(input)) {
            return product;
        }
    }
    return null;
}

Вызывающий все еще должен проверить, было ли что-то возвращено, то есть проверить, возвращается ли null. Однако вызывающему абоненту слишком легко забыть это сделать, поэтому использование Optional предпочтительнее.

0 голосов
/ 15 января 2020

Я бы предложил использовать дополнительный класс для достижения ваших целей. Ваш код может быть легко заменен этим кодом. Предполагая, что у вас есть список продуктов, можно использовать следующий код:

public Optional<Product> find(String name) {
    List<Product> products = productDao.fetchAll();
    return products.stream().filter(p -> StringUtils.equals(p.name, name)).findFirst().orElseThrow(<Insert some excpeption builder>);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...