我从glassfish 3升级到4,现在我的jsp正在抛出npe。我没有改变任何代码,所以它一定是一个不同的玻璃鱼。以前看起来像这样的jsp代码:
<c:when test="${invoke}">
现在给我一个npe除非我改成这样:
<c:when test="${not empty invoke && invoke}">
我想知道为什么这个改变是必要的。有人能告诉我是什么原因吗?为什么它以前能用,现在不能用了?
j91ykkif1#
表达式语言3显然是jee7的一部分,因此您可以检查规范。在进一步搜索之后,我找到了这个答案,它表明el3.0改变了它的默认行为,而不是2.2。如果您可以将默认强制行为更改为与以前的行为匹配,您的问题就会消失。我不知道如何在玻璃鱼里做到这一点。否则,您可能会考虑切换到 boolean 原语而不是 Boolean 物体。默认强制 null 到非基本类型(除了 String )退货 null s。例如,一个 null 被迫 Boolean 现在返回一个 null ,而 null 被迫 boolean 退货 false .还有,当你抱怨 NPE s、 几乎总是需要提供堆栈跟踪的相关部分。知道哪个类和方法抛出了异常是相当重要的。
boolean
Boolean
null
String
false
NPE
omjgkv6w2#
我也有同样的讨厌玻璃鱼4扔NPE的那种(想)埃尔布尔评估:
<c:if test="${couldNotExistVar}">
的使用场景 couldNotExistVar :如果有条件创建标志查询标志查询标志...jsp+jstl+el示例:
couldNotExistVar
<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。
2条答案
按热度按时间j91ykkif1#
表达式语言3显然是jee7的一部分,因此您可以检查规范。在进一步搜索之后,我找到了这个答案,它表明el3.0改变了它的默认行为,而不是2.2。如果您可以将默认强制行为更改为与以前的行为匹配,您的问题就会消失。我不知道如何在玻璃鱼里做到这一点。否则,您可能会考虑切换到
boolean
原语而不是Boolean
物体。默认强制
null
到非基本类型(除了String
)退货null
s。例如,一个null
被迫Boolean
现在返回一个null
,而null
被迫boolean
退货false
.还有,当你抱怨
NPE
s、 几乎总是需要提供堆栈跟踪的相关部分。知道哪个类和方法抛出了异常是相当重要的。omjgkv6w2#
我也有同样的讨厌玻璃鱼4扔NPE的那种(想)埃尔布尔评估:
的使用场景
couldNotExistVar
:如果有条件
创建标志
查询标志
查询标志
...
jsp+jstl+el示例:
作为一个解决方案,我发现最适合我添加以下第一行:
缺点:
当使用这种模式时,很容易忘记包含新的额外行。
请注意,只有在使用不同的(甚至使用相同的JavaEE版本)应用程序服务器而不响应GlassFish4时,才能在开发环境外检测到NPE。