java - jmdoudoux - tags jstl




Pourquoi Servlet.service() pour servlet jsp at-il créé cette exception? (4)

Cela peut être causé par une contamination de classpath. Vérifiez que vous /WEB-INF/lib ne contient pas quelque chose comme jsp-api-*.jar .

Je reçois l'erreur suivante, quel pourrait être le problème?

Mon descripteur de contexte:

<?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)

J'ai eu cette erreur; cela s'est passé de manière assez spontanée, et la page s'arrêtait dans le navigateur au milieu d'une balise HTML (pas une section de code). C'était déconcertant!

Il s'avère que je laisse une variable hors de portée et que le ramasse-miettes l'a emporté et j'ai essayé de l'utiliser. Ainsi, le timing apparemment aléatoire.

Pour donner un exemple plus concret ... Dans une méthode, j'avais quelque chose comme:

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

Maintenant, dans ma page JSP, j'ai appelé cette méthode et utilisé l'objet List renvoyé par celle-ci. L'objet List est soutenu par ce tableau "foos"; mais, le tableau est sorti de la portée quand je suis revenu de la méthode (puisque c'est une variable locale). Donc, peu de temps après, le ramasse-miettes a supprimé le tableau "foos" et mon accès à la liste a provoqué une exception NullPointerException puisque son tableau sous-jacent était maintenant effacé.

Je me suis en fait demandé, en écrivant la méthode ci-dessus, si cela se produirait.

Le problème sous-jacent encore plus profond était l'optimisation prématurée. Je voulais une liste, mais je savais que j'aurais exactement 20 éléments, alors je me suis dit que j'essaierais d'être plus efficace que le new ArrayList<Foo>(20) qui ne fixe qu'une taille initiale de 20 mais peut être moins efficace que la méthode que j'ai utilisée. Alors, bien sûr, pour y remédier, je viens de créer ma ArrayList, de la remplir et de la renvoyer. Plus aucune erreur étrange.


Le problème réside dans votre JSP, vous appelez très probablement une méthode sur un objet qui est nul à l'exécution.

Cela se produit dans l'appel _jspInit (), ce qui est un peu plus inhabituel ... le code de problème est probablement une déclaration de méthode comme <%! %> <%! %>

Mise à jour: je ne l'ai reproduite qu'en remplaçant la méthode _jspInit (). Est-ce ce que tu fais? Si oui, ce n'est pas recommandé - c'est pourquoi cela commence par un _.


Si votre projet est basé sur Maven, n'oubliez pas de définir la portée de ces dépendances comme suit: servlet-api, jsp-api. Sinon, ces fichiers seront exportés vers WEB-INF / lib et contamineront donc ceux du serveur Tomcat. Cela cause des problèmes douloureux.

<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>