Почему метод требует возвращаемого значения после оператора, который всегда возвращает true?

почему этому методу (тесту) нужно возвращаемое значение (оно всегда истинно)?

public boolean test() { //This method must return a result of type boolean
    if (true) {
       return true; // always return true
    }
}

и когда я добавил возвращаемое значение, он предупреждает как "мертвый код". Итак, почему бы не принять first test() метод

public boolean test(int i) {
   if (true) {
      return true;
    } else { //Dead code
      return false;
    }
 }

5 ответов


метод return analysis не анализирует if условие, чтобы увидеть, всегда ли это true или false, как правило, это не будет константой времени компиляции (иначе вы не писали бы if в первую очередь). Он просто видит, что есть if Это может быть или не может быть принято, и если это не принято, то метод не возвращает значение, следовательно, ошибка.

анализ мертвого кода выполняется в отдельном проходе к методу return analysis, который делает еще один углубленный анализ, который смотрит внутри условий ветви.

моя совершенно неосведомленная догадка заключается в том, что это поведение является артефактом того, как был разработан компилятор; метод return analysis является жизненно важной частью компиляции, чтобы убедиться, что вы получите действительную программу в конце, и поэтому была реализована одна из основных функций. Анализ мертвого кода-это "приятно иметь" , и поэтому он был реализован позже, используя более сложные алгоритмы (поскольку основные биты компилятора были закончены этим stage)


Это результат глубины анализа, который делает компилятор.


этот метод ничего не делает, так что да, это мертвый код. Если метод всегда возвращает true, вам не нужно его вызывать, просто используйте .


в Java, если вы указываете тип возврата (boolean), вы должны явно указать значение, независимо от того, всегда ли оно одно и то же. Тут возникает вопрос: если всегда одно и то же, зачем что-то возвращать? Вы уже знаете ответ в коде вызова.

почему бы просто не написать:

public boolean test() {
  return true;
}

что касается второй части вашего вопроса, компилятор видит, что второй путь никогда не берется в операторе if и дает вам предупреждение об этом.


Если вы что-то проверить, это может быть значение или другое значение. Поэтому вы не можете гарантировать, что это попадет внутрь оператора if.

if (someBoolean){
  return true;
}

не будет работать, потому что someBoolean может быть либо true, либо false. Если ваш метод должен что-то вернуть, а someBoolean является ложным, он ничего не вернет. Поэтому в этом случае вы можете сделать:

if (someBoolean){
  return true;
}

вернуть false;

или просто

return someBoolean;