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

抓住Lazy质化异常并抛出非法状态异常,这是一个好主意,如何?

赵飞语
2023-03-14

在使用Hibernate的持久化实体的上下文中,我想给开发人员提供更多的线索,当他们遇到LazyInitializationException,。。。未关闭任何会话或会话

我曾考虑在延迟加载的字段getter中捕获它,然后抛出一个带有新消息的IllegalStateException:

@OneToMany(mappedBy = "whatever", fetch = FetchType.LAZY, cascade = { CascadeType.MERGE, CascadeType.PERSIST })
@JoinColumn(name = "USER_ID")
private List<User> userList = new ArrayList<User>();

public List<User> getUserList() {
    try {
        List<User> userList = this.userList;
        return userList ;
    } catch (LazyInitializationException e) {
        throw new IllegalStateException("Here I explain everything", e);
    }
}

IllegalStateExcture似乎完全适合:

表示方法已在非法或不适当的时间被调用。换句话说,Java环境或Java应用程序不处于用于所请求操作的适当状态。

(来源:https://docs.oracle.com/javase/7/docs/api/java/lang/IllegalStateException.html )

但是渔获量没有达到,你知道为什么吗?顺便问一下,这是个好主意吗?

共有1个答案

狄峻熙
2023-03-14

因为在getter中,您在列表中所做的事情并不比标准getter多,所以无法实现捕获。

List<User> userList = this.userList;
return userList ;

严格等同于:

return this.userList;

同样的代码,同样的行为。

如果您查看LazyInitException的堆栈,您将看到getter不是stacktrace,因此,您的捕获没有按预期工作。

当您“使用”(像对列表执行任何方法调用)列表时会发生异常:例如,调用size()iterator()

因此,在getter中添加一个size()调用。

我建议吗?没有。

  1. LazyInitException stacktrace已经给出了未加载的字段:只需查看抛出它的集合,以及它来自哪个字段
  2. 您将丢失延迟加载(我同意如果调用getter,您将希望使用结果,但是getter中的这个不相关的方法调用(size())仍然是一种html" target="_blank">代码味道
 类似资料:
  • 这是我如何使用它 - 此外,我已经在超文本传输协议GET周围放置了一个最终块- 这是我的堆栈跟踪- 我正在使用Quartz来安排监控Httpendpoint的工作…这是我的连接池配置 马文依赖..神器版本 编辑-嗯,这个问题通过在最后一个块中不关闭CloseableHttp客户端而得到解决…有人能告诉我为什么它会这样吗?如果我关闭客户端,为什么连接池会关闭? 上面的closeablehttpcli

  • 我正在尝试使用下面的快速加载API 连接…等是完美的。 我确切地知道它在哪里失败 例外情况是 < code >线程“main”Java . lang . illegalstateexception中出现异常:示例失败。 这是我试图上传的表格。它是格式,当我通过记事本打开它时,它看起来像这样 为什么我会得到这个异常?我该如何改进?据我理解问题是< code > pstmtfld . setascii

  • 在你可以捕获异常之前,一些代码必须抛出一个异常。任何代码都可能会抛出异常:您的代码,来自其他人编写的包(例如Java平台附带的包)或Java运行时环境的代码。无论是什么引发的异常,它总是通过 throw 语句抛出。 您可能已经注意到,Java平台提供了许多异常类。所有类都是Throwable类的后代,并且都允许程序区分在程序执行期间可能发生的各种类型的异常。 您还可以创建自己的异常类来表示在您编写

  • 问题内容: 我正在查看一位同事的代码,但遇到一段类似于以下代码的代码: 我相信没有必要,但我很难证明这一点。如果它更具体(,等等)可能很有意义,但是因为我认为这是不必要的。有人可以给我一些原因,这可能导致什么问题,以及为什么这是不好的做法?还是这个代码可以吗? 问题答案: 该声明是方法合同的一部分。定义合同时,您应始终尽可能 精确 。因此,说是个坏主意。 出于同样的原因,这是不好的做法,因为不好的

  • 问题内容: 考虑以下代码: 无需添加方法签名即可编译该代码。(它与同样表现到位,太)。 我理解为什么 可以 安全地运行它,因为实际上不能将其引发在块中,因此不能引发已检查的异常。我有兴趣知道在何处指定此行为。 并非永远都不会达到目标:以下代码也会编译: 但是,如果抛出一个检查的异常,它不会像我期望的那样编译: 在JLS Sec 11.2.2中 ,它说: 一,其抛出的表达式语句(§14.18)具有静

  • 抛出异常有什么意义?例如,我偶然发现: 但是当你不扔零点的时候,你也会得到一个零点?我经常看到这个,我想知道这是否是一个学习的好习惯?