遵循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子类型?
答案 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
。
有些情况下断言会更合适,但说实话,我从未遇到过它们。