在 Closable.close() 中抛出运行时异常
Throw runtime exception in 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");
}
}
}
根据本书,"Which exception will the code throw?" 问题的正确答案是 "Runtime exception c with no suppressed exception"。
我已经在 Eclipse 中检查了这段代码,system.out 表明这本书是正确的。但是,我还稍微修改了代码并在抛出 RuntimeException "c"
之前添加了以下 system.out
System.out.println(e.getSuppressed().toString());
我从这个 system.out 得到的输出是:
[Ljava.lang.Throwable;@75da931b
很明显有一个被抑制的异常。在调试模式下,我还发现这个被抑制的异常是 close() 方法中的一个皱眉。
两个问题:
1、为什么console中没有close()方法抛出异常的信息?
2.书上给出的答案是否正确?
被抑制的异常 (RuntimeException
-A) 被添加到 IOException
中,在 catch
中捕获并从堆栈跟踪打印输出中丢失,因为它没有作为 [= RuntimeException
-C.
的 13=]
因此,当 RuntimeException
-C 从 main
打印时,它没有提及 IOException
或被抑制的 RuntimeException
-A。
因此本书的答案是正确的,因为从 main
方法传播的唯一异常是 RuntimeException
-C 没有 cause
(IOException
),并且没有任何被抑制的异常(就像在 IOException
上一样)。
在我学习 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");
}
}
}
根据本书,"Which exception will the code throw?" 问题的正确答案是 "Runtime exception c with no suppressed exception"。 我已经在 Eclipse 中检查了这段代码,system.out 表明这本书是正确的。但是,我还稍微修改了代码并在抛出 RuntimeException "c"
之前添加了以下 system.out System.out.println(e.getSuppressed().toString());
我从这个 system.out 得到的输出是:
[Ljava.lang.Throwable;@75da931b
很明显有一个被抑制的异常。在调试模式下,我还发现这个被抑制的异常是 close() 方法中的一个皱眉。
两个问题: 1、为什么console中没有close()方法抛出异常的信息? 2.书上给出的答案是否正确?
被抑制的异常 (RuntimeException
-A) 被添加到 IOException
中,在 catch
中捕获并从堆栈跟踪打印输出中丢失,因为它没有作为 [= RuntimeException
-C.
因此,当 RuntimeException
-C 从 main
打印时,它没有提及 IOException
或被抑制的 RuntimeException
-A。
因此本书的答案是正确的,因为从 main
方法传播的唯一异常是 RuntimeException
-C 没有 cause
(IOException
),并且没有任何被抑制的异常(就像在 IOException
上一样)。