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

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

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

и когда я добавляю возвращаемое значение, оно выдается как «Мертвый код» . Итак, почему бы не принять первый test() метод

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

Ответы [ 5 ]

11 голосов
/ 30 декабря 2010

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

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

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

2 голосов
/ 30 декабря 2010

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

1 голос
/ 30 декабря 2010

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

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

public boolean test() {
  return true;
}

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

1 голос
/ 30 декабря 2010

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

0 голосов
/ 30 декабря 2010

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

if (someBoolean){
  return true;
}

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

if (someBoolean){
  return true;
}

вернуть ложь;

или просто

return someBoolean;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...