我在IntelliJ中运行Play网络应用程序,在调试器端口9999上使用SBT。
我有一个User
模型和一个Info
模型,形成一对一的关系。每个User
对象都包含一个Info
对象。
当我运行应用程序并访问网页时,在IntelliJ的调试器中,当提取User user
时,它的info
字段仅填充{{ 1}}该信息条目的字段。因此,当我在id
中user.info.address.equals()
时,调试器会给出NPE,因为Evaluation Expression
中的任何其他字段都不会填充,因此为空。
info
但是,当我单击User user = User.findById(id); // user.info only has id populated, with everything else null
String addr = user.info.address;
if (addr.equals(someVariable)) // NPE in Evaluate Expression, but no bug when it actually runs
{
// Do something
}
else
{
// Do something else
}
并让代码转到时,应用程序实际运行而不是抛出NPE,并且Resume Program
中的不同字段正确显示。
所以,这让我很困惑。如果它是一个懒惰的提取(所以info
未填充,直到我们真正需要它),那么提取在哪里发生?上面的代码是紧挨着的,所以我想在之间不应该发生额外的数据库查询?
即使有一些查询发生,为什么info
没有拿起它,只是说NPE?