Недоступное утверждение при использовании return in finally? - PullRequest
1 голос
/ 23 марта 2010

Это компилируется:

class Ex1 {
    public int show() {
        try {
            int a=10/10;
            return 10;
        }   
        catch(ArithmeticException e) {
            System.out.println(e);
        }
        finally {
            System.out.println("Finally");
        }
        System.out.println("hello");
        return 20;
    }
}

с другой стороны, это не так:

class Ex15 {
    public int show() {
        try {
            int a=10/0;
            return 10;
        }
        catch(ArithmeticException e) {
            System.out.println(e);
        }
        finally {
            System.out.println("Finally");
            return 40;
        }

        System.out.println("hello");
        return 20;
    }
}

и выдает недостижимое утверждение System.out.println ("привет"); ошибка. почему так?

Ответы [ 4 ]

7 голосов
/ 23 марта 2010

Это unreachable code. Согласно компилятору, System.out.println("hello"); никогда не может быть выполнено.

Кроме того, НИКОГДА не пишите return в блоке finally. (см. Скрытые возможности Java , почему вы не должны).

EDIT:

Да, но что делает возвращение, наконец, сделать это?

Это не потому, что он находится в конечном блоке или что-то в этом роде. Даже если вы удалите ключевое слово finally, вы все равно получите сообщение об ошибке.

   class ex15 {
        public int show() {
            int a = 10 / 0;
            return 40;
            System.out.println("hello");
            return 20;
        }
    }

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

7 голосов
/ 23 марта 2010

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

finally
{   
    System.out.println("Finally"); 
    return 40;
}
System.out.println("hello"); // unreachable code
return 20;

На самом деле это ошибка компиляции в Java. Смотрите раздел 14.20 .

Это ошибка времени компиляции, если оператор не может быть выполнен, потому что это недоступно.

1 голос
/ 23 марта 2010

Когда вы помещаете «return» в блок «finally», все, что идет после него, никогда не будет выполнено. Оператор return завершает метод прямо там.

Вы получите ту же ошибку, если вы поместите System.out.println () в первом методе после оператора "return" в нем.

0 голосов
/ 23 марта 2010

У вас есть return в блоке finally. Это делает любые заявления после этого недоступными. Также у вас есть return в блоке try и снова в блоке finally. Это не имеет смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...