2016-08-26 6 views
3

Я столкнулся с одним сомнением в теме «Попробуйте с ресурсами».попробуйте с ресурсами

код программы:

public class Suppressed_Exception_Eg03 
{ 
    public static void main(String[] args) 
    { 
     try (Wolf obj = new Wolf(); Deer obj1 = new Deer();) 
     { 
      //Both close statements are executed . 
      //Therefore , we see two closing stmts 
     } 
     catch(Exception e) 
     { 
      System.out.println(e.getMessage()); 
     } 
} 

static class Wolf implements AutoCloseable 
{ 
    @Override 
    public void close() throws Exception 
    { 
     System.out.println("Closing Wolf !"); 
     throw new RuntimeException("In Wolf !"); 
    } 
} 

static class Deer implements AutoCloseable 
{ 
    @Override 
    public void close() throws Exception 
    { 
     System.out.println("Closing Deer !"); 
     throw new RuntimeException("In Deer !"); 
    } 
} 

Выход:

Closing Deer ! 
Closing Wolf ! 
In Deer ! 

Сомнения: Мы все знаем, что близки методы класса Deer будут закрыты первыми и после будет класс Wolf. Соответственно, исключение, вызванное классом Wolf, должно подавлять исключение, порожденное классом Дира. Итак, мы должны поймать исключение класса Волк в блоке catch. Но здесь мы видим, что в выпуске исключение класса Deer выловлено и напечатано. Может кто-нибудь объяснить, почему?

+2

Отформатируйте свой код, отложив каждый блок на четыре пространства, убедившись, что каждая строка на том же блоке или том же уровне блока имеет отступы точно такой же суммы, что и остальные. Да, это придирчивый запрос, но опять же, мы добровольцы, и вы хотите приложить усилия, чтобы облегчить другим помощь вам. –

+0

Исключение времени выполнения загружает вас из блока try. Если это мой код и проблема, я бы проверил байт-код. –

+1

Чтение документации всегда так полезно: [* «Обратите внимание, что тесные методы ресурсов вызываются в обратном порядке их создания». * * (Https://docs.oracle.com/javase/tutorial/essential/exceptions/ tryResourceClose.html) ... – Tom

ответ

5

Спецификация говорит:

ресурсы закрыты в обратном порядке, в котором они были инициализированы. Ресурс закрывается, только если он инициализирован значением, отличным от нуля. Исключение из закрытия одного ресурса не препятствует закрытию других ресурсов. Такое исключение подавляется, если исключение было ранее выбрано инициализатором, блоком try или закрытием ресурса.

Первое исключение в вашем коде (Deer) не подавляется, поскольку не было исключено исключение предыдущих исключений. Затем следующий ресурс закрывается (Wolf), но на этот раз исключается исключение из Wolf.

+0

Привет, Дэвид, я не знал, что «исключение из закрытия одного ресурса не препятствует закрытию других ресурсов» и «исключение подавляется, если исключение было ранее инициализировано инициализатором, блоком try или закрытие ресурса ". Если это так, то вывод оправдан. Спасибо, Дэвид! –

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