Удаление мертвого кода приводит к ошибке

1

Я использую 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 не может предсказать это?

  • 0
    Удалите return "" из блока catch . Имейте в виду, someMethod исключает String , но вы пытаетесь вернуть MyInterface ... похоже, у вас есть большие проблемы
  • 0
    Действительно сожалею об этой ошибке, она возвращает строку. Исправлено сейчас :)
Показать ещё 2 комментария
Теги:
spring-tool-suite
dead-code
eclipse-kepler

2 ответа

6
Лучший ответ

В вашем опубликованном коде нет мертвого кода. Единственная проблема, которую я вижу здесь:

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;
}
  • 0
    Действительно извините, в моем сообщении была ошибка. Он должен вернуть строку. Исправлено сейчас. Снова извиняюсь :)
  • 1
    @eivamu в любом случае. Это была единственная проблема в вашем коде. Кроме того, следуйте последней части моего поста.
Показать ещё 4 комментария
2

Скорее всего, вы используете аннотацию Eclipse org.eclipse.jdt.annotation.NonNull для метода domeSomething.

В этом случае компилятор Eclipse знает, что переменная не ссылается на null и, следовательно, код будет либо возвращать переменную (BTW: Это еще одна ошибка компилятора, поскольку переменная не относится к типу String), либо генерирует исключение, которое будет верните пустую строку. Последняя строка - это действительно мертвый код. Следовательно, предупреждение.

Однако удаление этой последней строки приводит к коду, который не соответствует JLS. Следовательно, ошибка компилятора.

  • 0
    Это не так (аннотация Eclipse не используется), однако это может иметь место в аналогичных ситуациях, так что спасибо за полезное предложение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню