2015-10-27 9 views
6

Во время учебы в OCPJP8 я столкнулся с одним вопросом, который не имеет однозначного ответа на меня. Рассмотрим следующий код:Исключение исключения выполнения в Closable.close()

public class Animals 
{ 
class Lamb implements Closeable 
{ 
    public void close() 
    { 
     throw new RuntimeException("a"); 
    } 
} 

public static void main(String[] args) 
{ 
    new Animals().run(); 
} 

public void run() 
{ 
    try (Lamb l = new Lamb();) 
    { 
     throw new IOException(); 
    } 
    catch (Exception e) 
    { 
     throw new RuntimeException("c"); 
    } 
} 
} 

Согласно правильному ответу на вопрос «Какое исключение будет вызывать код?» «исключение времени выполнения c без исключения». Я проверил этот код в Eclipse и system.out, предлагая, что книга прав. Тем не менее, я также изменил код немного и добавил следующее System.out только перед броском RuntimeException «с»

System.out.println(e.getSuppressed().toString()); 

и выход я получил от этого System.out является:

[Ljava.lang.Throwable; @ 75da931b

Так ясно есть подавляются исключение. В режиме отладки я также обнаружил, что это исключенное исключение - это тот, кто хмурится в методе close().

Два вопроса: 1. Почему в консоли нет информации об исключении, отправленном методом close()? 2. Правильно ли ответ, указанный в книге?

+0

В качестве примечания стороны используйте 'System.out.println (Arrays.toString (e.getSuppressed()));' для получения более значимого результата ... – Holger

ответ

3

Подавленная исключение (RuntimeException -A) добавляли к IOException пойманным в catch и потерял из стека трассировки распечатки, поскольку он не был принят в качестве cause из RuntimeException -СА.

Таким образом, когда RuntimeException -C распечатывается main это не имеет никакого упоминания о IOException или подавленной RuntimeException -Д.

И поэтому ответ книги является правильным, потому что единственным исключением, которое распространяется от метода main является RuntimeException -C без cause (IOException), и без каких-либо исключений подавленных (как это было на IOException).

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

  • Нет связанных вопросов^_^