web-dev-qa-db-fra.com

Pourquoi Servlet.service () pour servlet jsp lève-t-il cette exception?

J'ai 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)
28
Terman

Cela peut être dû à une contamination par un chemin de classes. Vérifiez que vous /WEB-INF/lib ne contient pas quelque chose comme jsp-api-*.jar.

36
axtavt

Si votre projet est basé sur Maven, n'oubliez pas de définir la portée sur fournie pour des dépendances telles que servlet-api, jsp-api. Sinon, ces fichiers JAR seront exportés vers WEB-INF/lib et seront donc contaminés par 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>
14
bnguyen82

J'ai eu cette erreur; cela s'est passé un peu spontanément et la page s'est arrêtée dans le navigateur au milieu d'une balise HTML (pas une section de code). C'était déroutant!

Il s’est avéré que j’ai laissé une variable hors de la portée et que le ramasse-miettes l’a balayée puis 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 sauvegardé par ce tableau "foos"; mais, le tableau est sorti de la portée lorsque je suis revenu de la méthode (puisqu'il s'agit d'une variable locale). Ainsi, peu de temps après son retour, le ramasse-miettes a balayé le tableau "foos" et mon accès à la liste a provoqué une exception NullPointerException puisque son tableau sous-jacent était maintenant effacé.

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

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

5
Ricket

Le problème provient de votre JSP. Il est fort probable que vous appeliez une méthode sur un objet qui est null au moment de l'exécution.

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


Mise à jour: je ne l'ai reproduit qu'en redéfinissant la méthode _jspInit (). Est-ce ce que vous faites? Si c'est le cas, ce n'est pas recommandé - c'est pourquoi cela commence par un _.

3
brabster

J'ai essayé de mon mieux pour suivre les réponses données ci-dessus. Mais j'ai ci-dessous la raison pour la même chose.

Remarque: Ceci concerne le déploiement de maven + Eclipse + Tomcat et le problème rencontré en particulier avec spring mvc.

1- Si vous incluez les dépendances servlet et jsp, veuillez les indiquer dans le champ d'application.

<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. Peut-être que vous pourriez inclure jstl en tant que dépendance. Alors, jsp-api.jar et servlet-api.jar sera inclus le long. Il faut donc exclure les servlet-api et jsp-api déployés selon les besoins de lib dans target ou dans "WEB-INF/lib", comme indiqué ci-dessous.

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