2013-02-22 6 views
0

я собирался через следующий код:Бросив исключение во время выполнения намеренно

public int returnSomething() { 
    try { 
     throw new RuntimeException("foo!"); 
    } finally { 
     return 0; 
    } 
} 

Пожалуйста, объясните, что этот кусок кода делает. Мой анализ заключается в том, что мы выбрасываем исключение во время выполнения внутри метода, но после этого блок «finally» определенно будет выполняться. Это верно?

+1

Хорошо, что случилось, когда вы его попробовали, и какой бит все еще запутывает вас? –

+0

@JonSkeet возвращение 0 один в замешательстве .. – user2094103

+0

Так вы попробовали? И вы тогда исследовали, почему вы получили результаты, которые вы сделали? –

ответ

0

Содержимое блока finally всегда выполняется. Единственное, что я знаю, это не произойдет, когда вы вытаскиваете вилку или сбои JVM. Я считаю, что это вернет 0.

0

Быстрый тест показывает, что это возвращает 0 вместо распространения исключения RuntimeException.

public class Test { 
    public static int returnSomething() { 
    try { 
     throw new RuntimeException("foo!"); 
    } finally { 
     return 0; 
    } 
    } 

    public static void main(String[] args) { 
    int i=returnSomething(); 
    System.out.println(i); 
    } 
} 
1

Ответ в Java Language Specification section 14.20.2. Вы должны знать, что возвращение считается, что «завершением внезапно»:

...

  • Если выполнение блока Ьги завершается преждевременно из-за забросом значения V, то есть выбор

    • [...]
    • Если, наконец, блок завершается преждевременно по какой-либо причине, то оператор попытка завершается преждевременно по той же самой причине.

(Все пути имеют ту же самую конечную точку, с некоторыми несколько иной формулировкой.)

Таким образом, общий результат в том, что 0 возвращается и исключение отбрасывается.

Редко хорошая идея вернуться с блока finally.

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