2016-02-24 5 views
1

Сотрудник только что разозлил меня относительно блоков в конце. Он утверждал, что если в блоке finally закрыто несколько ресурсов, мне не нужно беспокоиться об обработке исключений.Если в блоке finally закрыто несколько ресурсов, нужна ли обработка исключений?

Так что, если я закрою ресурсы этой

try { 
    // do stuff 
} catch(Exception e) { 
    // handle stuff 
} finally { 
    resource1.close(); 
    resource2.close(); 
} 

и исключение происходит в resource1.close(), будет близко() метод Resource2 дозвонились?

+7

Это 2016 год; почему вы не используете try-with-resources? Кроме того, попробуйте сами проверить – fge

+1

, нет. –

+0

Следуя предложению @ fge, перед попыткой и тестированием взгляните на Java [документацию] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls- 14.20.3.2) и [tutorial] (http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html). – aribeiro

ответ

1

Простая проверка подтвердит:

class MyResource implements AutoCloseable { 
    private final String name; 
    MyResource(String name) { this.name = name; } 

    @Override public void close() throws IOException { 
    System.out.println("Closing " + name); 
    throw new IOException(); 
    } 
} 

public static void main(String[] args) throws IOException { 
    MyResource a = new MyResource("a"); 
    MyResource b = new MyResource("b"); 
    try { 
    } finally { 
    a.close(); 
    b.close(); 
    } 
} 

Это будет печатать "Closing a", а затем распечатать трассировку стека; "Closing b" не печатается. В отличие от этого:

try (MyResource a = new MyResource("a"); 
     MyResource b = new MyResource("b")) { 
    } 

распечатать оба.

0

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