Я использую Eclipse 4.3 Kepler (фактически STS 3.6.1).
Я столкнулся с некоторым кодом:
private String someMethod(String myParam) {
try {
MyInterface myVar = (MyInterface) domeSomething(myParam);
if (myVar != null) {
return myVar.methodThatReturnsString();
}
} catch (Exception e) {
return "";
}
return ""; // eclipse marks this as dead code
}
(Как и следовало ожидать, метод doSomething()
некоторое исключение и возвращает интерфейс более общий, чем MyInterface
.)
Eclipse подчеркивает последний оператор возврата как мертвый код, и если я удалю его как подсказку, я и вверх с "Этот метод должен возвращать результат ошибки типа String".
Почему последний код возврата мертвый? Это из-за класса? Скажите, что doSomething()
может вернуть значение null, если вы его произведете, это приведет к исключению класса cast?
И почему Eclipse предлагает исправить ошибку с чем-то, что приводит к предупреждению о мертвом коде? Это потому, что Eclipse не может предсказать это?
В вашем опубликованном коде нет мертвого кода. Единственная проблема, которую я вижу здесь:
if (myVar != null) {
return myVar;
}
Вы возвращаете MyInterface
когда вы должны вернуть String
. Компилятор будет жаловаться на это, и это правильно.
Кроме того, в качестве лучшей альтернативы вам не следует напрямую возвращаться внутри блока try
или catch
, а вместо этого создавать одно место после этого блока, чтобы вернуть результат. Это заставит ваш код избежать ошибки компилятора с мертвым кодом. Ваш может выглядеть так:
private String someMethod(String myParam) {
String result = "";
try {
MyInterface myVar = (MyInterface) domeSomething(myParam);
if (myVar != null) {
result = myVar.methodThatReturnsString();
}
} catch (Exception e) {
//handle the exception
//basic handling shown
System.out.println("Warning. There was a problem executing someMethod:");
e.printStacktrace();
}
return result;
}
Скорее всего, вы используете аннотацию Eclipse org.eclipse.jdt.annotation.NonNull
для метода domeSomething
.
В этом случае компилятор Eclipse знает, что переменная не ссылается на null
и, следовательно, код будет либо возвращать переменную (BTW: Это еще одна ошибка компилятора, поскольку переменная не относится к типу String
), либо генерирует исключение, которое будет верните пустую строку. Последняя строка - это действительно мертвый код. Следовательно, предупреждение.
Однако удаление этой последней строки приводит к коду, который не соответствует JLS. Следовательно, ошибка компилятора.
return ""
из блокаcatch
. Имейте в виду,someMethod
исключаетString
, но вы пытаетесь вернутьMyInterface
... похоже, у вас есть большие проблемы