Недоступный оператор возврата в Java - PullRequest
1 голос
/ 10 октября 2009

Недавно я быстро написал эту маленькую функцию 5 минут назад, когда получил ошибку компилятора unreachable statement

private static boolean isTransientField(String name, Class beanClass) {
        try {
            Field field = beanClass.getDeclaredField(name);
            return (field.getModifiers() & Modifier.TRANSIENT) == Modifier.TRANSIENT;
        } catch (Exception e) {return false;}

        return false;//unreachable statement
    }

Очевидно, что мой последний return false недоступен, но почему, если мой catch блок работает только в исключительных случаях?

Ответы [ 7 ]

17 голосов
/ 10 октября 2009

Поскольку у вас есть оператор возврата в попытке.

3 голосов
/ 10 октября 2009

В вашем коде есть только два возможных пути выполнения.
1. Линия

Field field = beanClass.getDeclaredField(name);

... работает как положено, и возвращается следующая строка:

return (field.getModifiers() & Modifier.TRANSIENT) == Modifier.TRANSIENT

2. Возникает исключительная ситуация, и выполняется возврат в блоке catch.

Учитывая эти два пути, третье выражение return никогда не может быть достигнуто.

2 голосов
/ 10 октября 2009

Потому что вы также получили возврат в конце блока try.

1 голос
/ 10 октября 2009

То, что у вас есть, по сути эквивалентно следующему:

if (something)
    return true;
else
    return false;
else
    return false;

Теперь, зачем вам два других заявления? Это верно, вы бы не стали.

1 голос
/ 10 октября 2009

Поскольку у вас также есть возврат в вашем try блоке, так что, несмотря ни на что, возврат достигается в конструкции try catch.

0 голосов
/ 10 октября 2009

Просто повторюсь, не используйте блоки try / catch для логического потока. Блок catch должен использоваться для изящной обработки исключений / ошибок. Во-вторых, любая функция, которая НЕ объявлена ​​как void, должна возвращать некоторую форму объявленного типа, в вашем случае - логическое значение.

Возможное решение

private static boolean isTransientField(String name, Class beanClass) 
{
    try 
    {
        Field field = beanClass.getDeclaredField(name);
        if((field.getModifiers() & Modifier.TRANSIENT) == Modifier.TRANSIENT)
        {
            return true;
        }
        else
        {
            return false;
        }

    } 
    catch (Exception e) 
    {
        e.printStackTrace();
    }
}
0 голосов
/ 10 октября 2009

Хотя все вышеперечисленное верно, причина состоит в том, что ваш код будет либо успешно обрабатываться и возвращаться по счастливому пути, либо будет выдавать исключение и обрабатываться соответствующим образом, поэтому, по сути, вы предоставили if / else путь исполнения. Компилятор никогда не достигнет третьего оператора возврата. Если вы удалили возврат false из блока улова предупреждение исчезнет. Вы получите то же предупреждение, если будете обрабатывать проверенное исключение каким-либо образом (перебросить стек), потому что код будет либо возвращаться как ожидалось, либо сгенерировать исключение (другой путь выполнения if / else).

...