Всегда ли работает блок finally? - PullRequest
110 голосов
/ 21 января 2009

Есть ли какое-нибудь условие, когда, наконец, может не работать в Java? Спасибо.

Ответы [ 12 ]

0 голосов
/ 26 января 2016
//If ArithmeticException Occur Inner finally would not be executed
class Temp
{
    public static void main(String[] s)
    {
        try
        {
        int x = 10/s.length;
        System.out.println(x);
        try
            {
                int z[] = new int[s.length];
                z[10] = 1000;
            }catch(ArrayIndexOutOfBoundsException e)
            {
                System.out.println(e);
            }
         finally
        {
            System.out.println("Inner finally");
        }
        }
        catch(ArithmeticException e)
        {
            System.out.println(e);
        }
    finally 
    {
        System.out.println("Outer Finally"); 
    }

System.out.println("Remaining Code");   
}
}
0 голосов
/ 23 января 2014

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

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

try {
    InputStream is = getInputStreamMethod();
    renderBinary(is, "out.zip");
catch (Exception e) {
    e.printStackTrace();
} finally {
    cleanUp();
}

Возможно, поток прерывается или что-то при вызове renderBinary (). Я подозреваю, что то же самое происходит с другими вызовами render (), но я не проверял это.

Я решил проблему, переместив renderBinary () после try / catch. Дальнейшие исследования показали, что play предоставляет аннотацию @Finally для создания метода, который выполняется после выполнения действия контроллера. Предостережение заключается в том, что это будет вызвано после выполнения ЛЮБОГО действия в контроллере, поэтому это не всегда может быть хорошим выбором.

...