为什么servlet jsp的Servlet.service()会抛出这个exception?

我得到以下错误,可能是什么问题?

我的上下文描述符:

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <servlet> <servlet-name>UploadServlet</servlet-name> <servlet-class>controller.UploadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <url-pattern>/UploadServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> 
 SEVERE: Servlet.service() for servlet jsp threw exception java.lang.NullPointerException at org.apache.jsp.index_jsp._jspInit(index_jsp.java:22) at org.apache.jasper.runtime.HttpJspBase.init(HttpJspBase.java:52) at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:159) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:329) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454) at java.lang.Thread.run(Unknown Source) Feb 23, 2010 11:35:28 PM org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet jsp threw exception java.lang.NullPointerException at org.apache.jsp.index_jsp._jspInit(index_jsp.java:22) at org.apache.jasper.runtime.HttpJspBase.init(HttpJspBase.java:52) at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:159) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:329) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454) at java.lang.Thread.run(Unknown Source) 

它可能是由类path污染引起的。 检查你的/WEB-INF/lib是否包含像jsp-api-*.jar

如果你的项目是基于Maven的,记得把范围设置为servlet-api,jsp-api等依赖项。 否则,这些jar子将被导出到WEB-INF / lib,从而与Tomcat服务器中的那些产生污染。 这会导致痛苦的问题。

 <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.1</version> <scope>provided</scope> </dependency> 

我有这个错误; 它有点自发地发生,页面会停留在HTML标签中间的浏览器中(而不是一段代码)。 真是莫名其妙!

事实certificate,我让variables超出范围,垃圾收集器将其扫除,然后尝试使用它。 这样看似随机的时机。

给一个更具体的例子…在一个方法中,我有这样的东西:

 Foo[] foos = new Foo[20]; // fill up the "foos" array... return Arrays.asList(foos); // this returns type List<Foo> 

现在在我的JSP页面中,我调用了该方法,并使用它返回的List对象。 List对象由该“foos”数组支持; 但是,当我从方法返回时,数组超出了范围(因为它是一个局部variables)。 所以在返回之后不久,垃圾收集器就扫除了“foos”数组,我对List的访问导致了一个NullPointerException,因为它的基础数组现在已经被清除了。

当我写上述方法时,我真的很想知道这是否会发生。

更深层次的问题是不成熟的优化。 我想要一个列表,但是我知道我只有20个元素,所以我想我会比new ArrayList<Foo>(20)更有效,它只设置20的初始大小,但可能效率低于我用的方法。 所以当然,为了解决这个问题,我创build了我的ArrayList,并将其填充并返回。 没有更奇怪的错误。

问题在于你的JSP,很可能你正在调用一个在运行时为null的对象的方法。

它发生在_jspInit()调用中,这有点不寻常……问题代码可能是像<%! %> <%! %>


更新:我只重写了_jspInit()方法。 那是你在做什么? 如果是这样,不build议 – 这就是为什么以_开头。

我尽我所能按照上面给出的答案。 但我有下面的理由相同。

注意:这是maven + eclipse + tomcat部署和面临的问题,特别是spring mvc。

1-如果你要包含servlet和jsp依赖项,请在范围内标记它们。

 <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.1</version> <scope>provided</scope> </dependency> 
  1. 可能你可能包括jstl作为依赖。 所以, jsp-api.jarservlet-api.jar将被包含在内。 因此,需要在目标或“WEB-INF / lib”中排除正在部署为所需lib的servlet-api和jsp-api,如下所示。

     <dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl-api</artifactId> <version>1.2</version> <exclusions> <exclusion> <artifactId>servlet-api</artifactId> <groupId>javax.servlet</groupId> </exclusion> <exclusion> <artifactId>jsp-api</artifactId> <groupId>javax.servlet.jsp</groupId> </exclusion> </exclusions> </dependency>