我可以在EJB方法中抛出AssertionError吗?

时间:2015-02-11 09:35:47

标签: java java-ee error-handling ejb

遵循Joshua Bloch的Effective Java中使用的样式并且与this问题的答案一致,我过去在Java SE环境中使用过AssertionErrors来寻找永远不会执行的代码路径。 / p>

看看Java EE,EJB 3.1规范说

  

如果bean方法遇到系统异常或错误,它应该只是将错误从bean方法传播到容器(即,bean方法不必捕获异常)。

并且稍微向下,它表示在非ApplicationException的情况下必须丢弃相关的EJB实例。据我所知,如果后续请求中需要该EJB的另一个实例,则容器从池中取出一个或在必要时创建一个新实例,因此应该没有与之相关的问题(当然,如果它是@Singleton EJB)。

在会话bean方法中使用AssertionError指示编程错误是否合适/好?或者是否有更合适的Throwable子类型?

1 个答案:

答案 0 :(得分:1)

我在扔AssertionError时没有看到任何错误。容器应该能够执行回滚,就像任何无法解决的异常一样。

话虽如此,我从不抛弃AssertionError。我将抛出RuntimeException子类的几个常见示例(可能比AssertionError更合适)是:

假设我们有enum

public enum TestEnum {
  TEST1, TEST2;
}

我想抓住默认情况,在此我扔了IllegalArgumentException

public class TestClass {

  public void doSomethingWithTestEnum(TestEnum testEnum) {
    switch (testEnum) {
    case TEST1:
      // do something here
      break;
    case TEST2:
      // do something here
      break;
    default:
      throw new IllegalArgumentException("Unknown enum type: " + testEnum);
    }
  }

}

另一个例子是参数验证:

public class TestClass {

  private String testString;

  public TestClass(String testString) {
    this.testString = Objects.requireNonNull(testString);
  }

}

如果NullPointerException为空,则抛出testString

有些情况下断言会更合适,但说实话,我从未遇到过它们。