在finally代码块中抛出一个异常会屏蔽之前在trycatch抛出的异常。 被屏蔽的异常信息和堆栈都会丢失。

如下代码:

try {
  /* some work which end up throwing an exception */
  throw new IllegalArgumentException();
} finally {
  /* clean up */
  throw new RuntimeException();                          // Non-Compliant - will mask the IllegalArgumentException
}

应该重构为:

try {
  /* some work which end up throwing an exception */
  throw new IllegalArgumentException();
} finally {
  /* clean up */                                         // Compliant
}