Бросить исключение времени выполнения в Closable.close()

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

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 "c"

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

и вывод, который я получил из этого system.out:

[Ljava.lang.Throwable;@75da931b

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

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


person kukis    schedule 27.10.2015    source источник
comment
В качестве примечания: используйте System.out.println(Arrays.toString(e.getSuppressed()));, чтобы получить более содержательный вывод…   -  person Holger    schedule 28.10.2015


Ответы (1)


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

Поэтому, когда RuntimeException-C печатается из main, в нем нет упоминания о IOException или подавленном RuntimeException-A.

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

person Zoran Regvart    schedule 27.10.2015