tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Arvīds Grabovskis <arvids.grabovs...@gmail.com>
Subject Re: NullPointerException for conditions in compiled JSPs
Date Wed, 11 Sep 2013 15:07:29 GMT
2013/9/11 Konstantin Kolinko <knst.kolinko@gmail.com>

> 2013/9/11 Arvīds Grabovskis <arvids.grabovskis@gmail.com>:
> > Hi,
> >
> > If JSP includes a line "<c:if test="${nonExisting}">Hello,world!</c:if>"
> > where "nonExisting" is attribute that does not exist, then
> > NullPointerException will be thrown. The cause is at
> >
> http://svn.apache.org/repos/asf/tomcat/trunk/java/org/apache/jasper/compiler/JspUtil.java
> > at
> > line #421 which generates something like:
> > ((java.lang.Boolean)
> >
> org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${nonExisting}",
> > java.lang.Boolean.class,
> (javax.servlet.jsp.PageContext)_jspx_page_context,
> > null, false)).booleanValue()
> >
> > The result of proprietaryEvaluate() is null (because of EL 3.0 changes
> > regarding coercing), hence calling booleanValue() will throw NPE. The
> > latest changes in EL specification does require guarding against such
> null
> > pointer access (otherwise it will break lots of existing applications). I
> > really hope that this is not intended behavior.
> >
> > Double checked the existence of error with Tomcat v8.0.0-RC1 (the same
> > problem affects the Glassfish v4, but they have a forked version of JSPC
> >
>
> 1. Why does it try to convert to "boolean" and not to "Boolean"?
>
> 2. Yes, a null cannot be converted to primitive boolean value, so an
> NPE is the correct behaviour here. So the generated code is correct.
>
> So the question is why EL expression "${nonExisting}" or "${null}" was
> not evaluated to Boolean.FALSE.
>
> What version of JSTL are you using?
> Are you sure that you are using EL-aware versions of the tags
> (JSTL 1.1+) instead of older JSTL 1.0 ones?
>
> What are the steps to reproduce the issue on a clear installation?
> What is your version of Tomcat?
> What is you stacktrace?
>
>
> Best regards,
> Konstantin Kolinko
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: dev-help@tomcat.apache.org
>
>
Konstantin,

1. Manual unboxing does solve potential NPE problems in other parts (where
auto-unboxing would throw NPE)... so this is not the real problem... imho.

2. As far as I understand, this is direct result of incompatibility between
EL 3.0 (
http://download.oracle.com/otndocs/jcp/el-3_0-fr-eval-spec/index.html) and
2.2 as stated in EL spec this is intended behavior of EL. Here's the
citation (Section A.4):
"The default coercion for nulls to non-primitive types (except String)
returns
nulls. For instance, a null coerced to Boolean now returns a null, while a
null coerced to boolean returns false."

Environment:
* JSTL 1.2+
* Tomcat version 8.0.0-RC1 (as previously stated)
* JDK 1.7.0_21

I also added a demo application (I hope that mail client won't block it) -
just drop it in fresh Tomcat v8 and you'll get the error.

here's the stack trace:
java.lang.NullPointerException
org.apache.jsp.index_jsp._jspx_meth_c_005fif_005f0(index_jsp.java:109)
 org.apache.jsp.index_jsp._jspService(index_jsp.java:81)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
 org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:403)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:347)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:91)

-- Arvīds

Mime
View raw message