2015-11-05 3 views
-2

Я использую следующий код в классе Triangle, чтобы разрешить пользователю устанавливать первую, вторую или третью точку объявленного Triangle.Java: отсутствующий оператор возврата после try-catch

public Point get(String p) throws IllegalArgumentException { 
    IllegalArgumentException e = new IllegalArgumentException(); 
    try { 
     if (p == "first") { return first; } 
     else if (p == "second") { return second; } 
     else if (p == "third") { return third; } 
     else { throw e; } 
    } 
    catch (e) { 
     System.out.println("Error: " + e); 
    } 
} 

Компилятор tellinng меня:

Triangle.java:41: error: missing return statement 
    } 
    ^

Но я думал, что точка заявления на вылов должен был быть в состоянии поймать ошибку и возвращает строку с описанием ошибки, без необходимости беспокоиться о соответствующий типу возврата функции.

+0

вы [сравнение строк с помощью ссылки] (http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java), но эта конкретная ошибка связана с тем, что блок 'catch' не приводит к« возврату »или« броску », и этот метод должен верните «Точку». –

+2

Возможный дубликат [Ошибка компилятора Java: Отсутствует заявление о возврате] (http://stackoverflow.com/questions/29310907/java-compiler-error-missing-return-statement) – Basilevs

+0

Пожалуйста, не отвечайте на дубликаты. См. [Почему переполнение стека настолько отрицательное в последнее время?] (Http://meta.stackoverflow.com/a/252077) – Basilevs

ответ

3

Потому что вам не хватает заявления return.

Метод объявляет, что он что-то возвращает, поэтому должен вернуть что-то (или выбросить исключение). Компилятор не может гарантировать, что любой из операторов return в блоке try будет достигнут, если исключение будет выброшено до того, как будет выполнено какое-либо из них. Таким образом, блок catch также должен что-то вернуть (или выбросить исключение, или вернуть что-то после завершения конструкции try/catch).

Редактировать: Вновь, вы также потенциально не видите return в блоке try. (Если у вас его нет после всей структуры try/catch.) Что делать, если ни одно из условий в структуре if/else не выполняется? Ничего не возвращается. Это неверно.

В принципе, все логические пути должны приводить к действительному выходу метода. Вы пропустили два таких пути.

-1

У вас есть три утверждения if. Что происходит, когда вход не удовлетворяет ни одному из них? В этом случае у вашего метода нет оператора возврата.

2

Вы ничего не возвращаете в своей функции на нескольких дорожках.

But I thought the point of the catch statement was to be able to catch an error and return a string describing the error, without having to worry about matching the function's return type.

Это не совсем то, что try-catch делает, и к тому же ваша функция объявлена ​​возвращать Point не String.

try-catch просто «ловит» а Throwable (Error или Exception) и позволяет запускать код, когда он выброшен вместо того, чтобы просто завершая программу с Uncaught Exception/Error.

Вам нужно вернуть какое-либо значение из вашей функции после try-catch, нет способа вернуть строку, и не существует языковой конструкции, которая ведет себя так, как вы объяснили свое понимание try-catch.

Также ваш код cna't фактически выдает IllegalArgumentException, поэтому ваш блок catch никогда не будет вызван. В этом случае, это похоже на то, что вы хотите, вместо того, чтобы что-то вроде этого

public Point get(String p) throws IllegalArgumentException { 
     if (p == null) { throw new IllegalArgumentException(); } 
     if (p.equals("first")) { return first; } 
     else if (p.equals("second")) { return second; } 
     else if (p.equals("third")) { return third; } 
     else { throw new IllegalArgumentException(); } 
} 

Код может тогда называться как так

Point p; 
try { 
    p = get("notFirst"); 
} catch (IllegalArgumentException ex) { 
    //oh no, we gave a bad argument, and the method told us nicely. 
} 
+0

Я не вижу, чтобы он возвращал строку, я вижу, что он возвращает именованную переменную неизвестного типа, который вполне может быть точкой – Shadow

+1

Я согласен @Shadow, но прочитал цитируемый раздел, пожалуйста. «верните строку, описывающую ошибку, не беспокоясь о совпадении типа возвращаемой функции». Это звучит намного больше похоже на то, что он хочет «выкинуть» «Исключение», а не обрабатывать один (поскольку ни один из этих кодов не может фактически вызвать «IllegalArgumentException» 'anyway. – CollinD

+0

Да, но,« вернув строку », он ссылается на использование' System.out.println() 'в своем блоке' catch'. В любом случае +1 для 'throws IllegalArgumentException' для функции – Shadow

0

отсутствуют Вы две части: 1.return заявления в Ьге блоке для еще условия 2. Выгоды блока не приводит к return заявления или throw заявления

Я не знаю, если тип первый, второе, третьи переменные строки или точка, но вы должны вернуться с точкой, потому что ваша функция: общественного Точка прибудет (String р) { ... }

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