当前位置: 首页 > 知识库问答 >
问题:

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

凌波峻
2023-03-14

遵循Joshua Bloch的《有效的Java》中使用的风格,并与这个问题的答案一致,我过去在Java SE环境中使用AssertionErrors来表示不应该执行的代码路径。

看看JavaEE,EJB3.1规范说

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

再往下一点,它说在非应用程序异常的情况下必须丢弃相关的EJB实例。据我所知,如果在后续请求中需要该EJB的另一个实例,容器会从池中取出一个或在必要时创建一个新实例,因此应该没有与之相关的问题(当然,如果它是@Singleton EJB除外)。

在会话bean方法中使用AssertionError来指示编程错误是否合适/良好?或者有一种更合适的可丢弃的亚型吗?

共有1个答案

澹台锐
2023-03-14

我看不出抛出< code>AssertionError有什么错。容器应该能够执行回滚,就像对任何未被取消的异常一样。

话虽如此,我自己从来不会抛出AsserutionError。有几个常见的例子,我会抛出一个运行时Exception的子类,这可能比AssersisError更合适,是:

假设我们有一个枚举

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);
  }

}

这里,如果<code>testString。

在某些情况下,断言可能更合适,但老实说,我从未遇到过。

 类似资料:
  • 问题内容: 通过Joshua Bloch的“ Effective Java-Second Edition”,我偶然发现了第152页上的以下代码: 现在令我困惑的是,主动抛出该异常。那被认为是好的做法吗?据我所知,断言用于避免与代码发生干扰,因此在启动Java编程时未启用断言且因此未执行断言语句时,行为不会改变。如果我在没有启用断言的情况下运行程序时得到一个提示,我就会很困惑。 尽管我知道示例案例可

  • 问题内容: 运行此命令时: 响应为: 这对我来说真是太棒了。我本以为这会带来编译时错误。 为什么我可以在Java中抛出null,为什么将其转换为NullPointerException? (实际上,鉴于我抛出的是null,因此我不知道这是否是“ upcast”) 除了一个非常愚蠢的面试问题(请没人在面试中问这个问题)之外,我看不到任何理由。也许您想被解雇,但这就是…我的意思是,为什么还会有人呢?

  • 问题内容: 假设我有类,并且其中的类具有可读和可写的属性: 是否可以只使用该方法而只使用该方法? 问题答案: 不可以,无法分配每个类别的访问权限。 考虑将您的类分为单独的接口,以便每个类仅获得一个具有所需接口的对象。例如: 当然,这涉及安全性,但这应该使您朝正确的方向进行思考。

  • 问题内容: 当存在后置条件时,该方法的返回值一定不能为null,该怎么办? 我可以 但是断言可以关闭! 那可以吗 ? 还是针对此类情况使用用户定义的异常(例如NullReturnValueException)更好? 问题答案: 我认为在JVM为您执行操作之前尽早抛出NPE没问题-特别是对于null参数。对此似乎有一些争论,但是Java SE库中有许多示例正是这样做的。我不明白为什么NPE在您自己不

  • 通过阅读Joshua Bloch的“有效Java-第二版”,我在第152页偶然发现了以下代码: 现在让我感到困惑的是,被主动抛出。这被认为是好的做法吗?根据我的理解,断言用于不与代码交错,这样当java编程在没有启用断言的情况下启动并且因此不执行断言语句时,行为不会改变。如果我在运行程序时甚至不启用断言时会得到一个,我会相当困惑。 尽管我知道示例情况可能会经常发生,但您分析了几个不同的选项,如果它

  • 本文向大家介绍如果父类中的方法“抛出异常”,我们可以在Java中的重写方法中将其删除吗?,包括了如果父类中的方法“抛出异常”,我们可以在Java中的重写方法中将其删除吗?的使用技巧和注意事项,需要的朋友参考一下 当超类方法在覆盖它时引发异常时,您需要遵循某些规则。 子类方法应该抛出Same异常,或者子类型- 它不应该抛出超级类型的异常- 您可以将方法保留在子类中而不会引发任何异常 根据第三条规则,