java—当我从GlassFish3升级到4时,为什么我的JSP中会出现NullPointerException?

hjqgdpho  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(352)

我从glassfish 3升级到4,现在我的jsp正在抛出npe。我没有改变任何代码,所以它一定是一个不同的玻璃鱼。以前看起来像这样的jsp代码:

<c:when test="${invoke}">

现在给我一个npe除非我改成这样:

<c:when test="${not empty invoke && invoke}">

我想知道为什么这个改变是必要的。有人能告诉我是什么原因吗?为什么它以前能用,现在不能用了?

j91ykkif

j91ykkif1#

表达式语言3显然是jee7的一部分,因此您可以检查规范。在进一步搜索之后,我找到了这个答案,它表明el3.0改变了它的默认行为,而不是2.2。如果您可以将默认强制行为更改为与以前的行为匹配,您的问题就会消失。我不知道如何在玻璃鱼里做到这一点。否则,您可能会考虑切换到 boolean 原语而不是 Boolean 物体。
默认强制 null 到非基本类型(除了 String )退货 null s。例如,一个 null 被迫 Boolean 现在返回一个 null ,而 null 被迫 boolean 退货 false .
还有,当你抱怨 NPE s、 几乎总是需要提供堆栈跟踪的相关部分。知道哪个类和方法抛出了异常是相当重要的。

omjgkv6w

omjgkv6w2#

我也有同样的讨厌玻璃鱼4扔NPE的那种(想)埃尔布尔评估:

<c:if test="${couldNotExistVar}">

的使用场景 couldNotExistVar :
如果有条件
创建标志
查询标志
查询标志
...
jsp+jstl+el示例:

<c:if test="${ obj.someExpensiveCalculation }">
    <c:set var="couldNotExistVar" value="true" scope="request" />
</c:if>

作为一个解决方案,我发现最适合我添加以下第一行:

<c:set var="imSureExistsVar" value="false" scope="request" />
<c:if test="${ obj.someExpensiveCalculation }">
    <c:set var="imSureExistsVar" value="true" scope="request" />
</c:if>

缺点:
当使用这种模式时,很容易忘记包含新的额外行。
请注意,只有在使用不同的(甚至使用相同的JavaEE版本)应用程序服务器而不响应GlassFish4时,才能在开发环境外检测到NPE。

相关问题