2014-09-01 2 views
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.)

Затмение подчеркивает последний return мертвый код, и если я удалю его как подсказку, я и выше с помощью «Этот метод должен возвращать результат ошибки типа String».

Почему последний код возврата мертвый? Это из-за класса? Скажем, что doSomething() может вернуть значение null, если вы его произнесете, это приведет к исключению класса cast?

И почему Eclipse предлагает исправить ошибку с чем-то, что приводит к ошибке предупреждение? Это потому, что Eclipse не может предсказать это?

+0

Удалите 'return '" 'из блока' catch'. Имейте в виду, 'someMethod' исключает' String', но вы пытаетесь вернуть 'MyInterface' ... похоже, что у вас больше проблем – MadProgrammer

+0

Действительно извините за эту ошибку, она возвращает строку. Исправлено сейчас :) – eivamu

+0

Что-то совсем другое: мне нравится ваш логотип! – Seelenvirtuose

ответ

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

Действительно извините, произошла ошибка в моем посте. Он должен вернуть строку. Исправлено сейчас. Еще раз, извините :) – eivamu

+1

@eivamu в любом случае. Это была единственная * проблема * в вашем коде. Кроме того, следуйте за последней частью моего сообщения. –

+1

+1 для одной записи, один выход :) – MadProgrammer

2

Вы, скорее всего, с помощью аннотаций в Eclipse org.eclipse.jdt.annotation.NonNull на методе domeSomething.

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

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

+0

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

Смежные вопросы