Управление потоком данных в исключении закрытия с использованием ресурсов - PullRequest
0 голосов
/ 09 мая 2018

Я не смог найти ответ с помощью поиска Google, поэтому я спрашиваю его здесь (для помощи в навигации). Если нужно вернуть значение в блоке try-with-resources, метод close генерирует исключение, я обрабатываю исключение без выброса и возобновляю выполнение, возвращаемое значение, которое я пытался вернуть, или возобновляет выполнение после перехвата блок? Например:

public static int test(){
    class Foo implements AutoCloseable{
        @Override
        public void close(){
            throw new RuntimeException();
        }
    }
    try(Foo foo = new Foo()){
        return 1;
    }
    catch (RuntimeException e){
        //handle exception without throwing
    }
    return 2;
}

1 Ответ

0 голосов
/ 09 мая 2018

Исключение приводит к тому, что выполнение достигает оператора catch, поэтому возвращается 2.
Он связан с операцией close(), которая обязательно вызывается в операторе try-with-resources, прежде чем разрешить методу возврат.

Я не нашел конкретной части JLS, в которой указан случай с возвратом.
Таким образом, вы должны учитывать, что общее объяснение применимо:

14.20.3. примерочных с-ресурсов

...

Если все ресурсы успешно инициализируются, блок try выполняется как нормальный, а затем все ненулевые ресурсы попробовать с ресурсами Заявление закрыто.

Обратите внимание, что без try-with-resources вы, вероятно, напишите этот код:

try(Foo foo = new Foo()){
    return 1;
}
catch (RuntimeException e){
    //handle exception without throwing
}
return 2;

таким образом:

try{
    Foo foo = new Foo();
    foo.close(); // handled automatically by  try-with-resources 
    return 1;
}       
catch (RuntimeException e){
    //handle exception without throwing
}
return 2;

Так что должно иметь смысл, почему 1 не может быть возвращено.
Обратите внимание, что код, сгенерированный компилятором try-with-resources, намного длиннее и сложнее, чем псевдоэквивалентность, которую я предоставил из-за исключенных исключений. Но это не ваш вопрос, поэтому позвольте мне поддержать эту точку зрения.

...