Java Sonar Null Внимание: «null возвращен, но ожидается Boolean» - PullRequest
0 голосов
/ 24 октября 2018

Как можно отредактировать этот блок кода как читаемый или логичный способ, не предупреждая от сонара.Мне нужно три результата false, true или null

 public Boolean x() {
    if (...) {
        return true;
    } else if (...) {
        return false;
    } else {
        return null;
    }
}

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

Хотя вы можете вернуть ноль, вы не должны, по крайней мере, в соответствии с squid:S2447

Хотя null технически является допустимым логическим значением, этот факт и различие между Boolean и boolean легко забыть.Поэтому возврат null из метода Boolean может вызвать проблемы с кодом вызывающего абонента.

Если вы не согласны, вы можете отключить его локально:

return null;//NOSONAR

Или деактивироватьэто правило полностью в настройках

Также обсуждается в сонарная группа :

Многие правила также критикуют вещи, которые я лично не нахожу плохими, т. е. "Нуль не должен бытьвозвращено из "логического" метода (squid: S2447) ".Поэтому я, вероятно, не могу дать хороших советов.

и Сообщество сонаров Вопрос:

Я предлагаю ввести дополнительное правило для этого.

Таким образом, логическое значение не следует проверять следующим образом:

Boolean flag = service.getFlag();
// that's the unsafe call which could cause a null pointer exception
if(flag) {
     // do something
}

Ответ:

Вместо введения нового правила, как насчет использования S2447?: Нулевое значение не должно возвращаться из «логического» метода 1, который запрещает методу, возвращающему логический объект, возвращать нулевое значение?

0 голосов
/ 24 октября 2018

Кроме того, благодаря использованию Optional мне не нужно проверять нулевой контроль.

Например: мой первый кодовый блок

    public Boolean x() {
    if (...) {
        return true;
    } else if (...) {
        return false;
    } else {
        return null;
    }
}

public void y() {
    Boolean result = x();
    if (result != null && result == true) {
        System.out.println(true);
    } else if (result != null && result == false) {
        System.out.println("false");
    } else {
        System.out.println("null");
    }
}

После этого, используя опционально мой код

    public Optional<Boolean> x2() {
    if (...) {
        return Optional.of(Boolean.TRUE);
    } else if (...) {
        return Optional.of(Boolean.FALSE);
    } else {
        return Optional.empty();
    }
}

public void y2() {
    Optional<Boolean> result = x2();
    if (result.equals(Optional.of(Boolean.TRUE))) {
        System.out.println(true);
    } else if (result.equals(Optional.of(Boolean.FALSE))) {
        System.out.println("false");
    } else {
        System.out.println("null");
    }
}

Я удалил нулевой элемент управления

0 голосов
/ 24 октября 2018

Начиная с Java 8 используйте Optional для кодирования TRUE, FALSE, Optional.empty.Он следует шаблону «избегать возврата нуля» и в то же время подавит предупреждение SonarQube.

Код будет

public Optional<Boolean> x() { 
    if (...) { 
       return Optional.of(Boolean.TRUE); 
    } 
    else if (...) { 
       return Optional.of(Boolean.FALSE); 
    } 
    else { 
       return Optional.empty(); 
    } 
} 
...