Подтвердить что ты не робот

Почему Servlet.service() для сервлета jsp выбрал это исключение?

Я получаю следующую ошибку, что может быть проблемой?

Мой дескриптор контекста:

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

Ответ 1

Это может быть вызвано загрязнением класса. Убедитесь, что вы /WEB-INF/lib не содержат что-то вроде jsp-api-*.jar.

Ответ 2

Если ваш проект основан на Maven, не забудьте указать область для таких зависимостей, как servlet-api, jsp-api. В противном случае эти банки будут экспортироваться в 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>

Ответ 3

У меня была эта ошибка; это произошло несколько спонтанно, и страница остановилась в браузере в середине HTML-тега (а не в разделе кода). Это было непонятно!

Оказывается, я разрешаю переменной выйти из сферы действия, и сборщик мусора убрал ее, а затем я попытался ее использовать. Таким образом, казалось бы, случайное время.

Чтобы дать более конкретный пример... Внутри метода у меня было что-то вроде:

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

Теперь на моей странице JSP я вызвал этот метод и использовал возвращаемый им объект List. Объект List поддерживается этим массивом "foos"; но массив вышел из области видимости, когда я вернулся из метода (поскольку это локальная переменная). Поэтому вскоре после возвращения сборщик мусора сместил массив "foos", и мой доступ к списку вызвал исключение NullPointerException, поскольку его базовый массив теперь был уничтожен.

Я действительно задавался вопросом, как я написал вышеописанный метод, будет ли это происходить.

Еще более глубокая проблема заключалась в преждевременной оптимизации. Мне нужен список, но я знал, что у меня будет ровно 20 элементов, поэтому я решил, что постараюсь быть более эффективным, чем new ArrayList<Foo>(20), который устанавливает только начальный размер 20, но может быть менее эффективным, чем метод, который я использовал. Поэтому, конечно, чтобы исправить это, я просто создал свой ArrayList, наполнил его и вернул. Не более странная ошибка.

Ответ 4

Проблема в вашем JSP, скорее всего, вы вызываете метод для объекта, который является нулевым во время выполнения.

Это происходит в вызове _jspInit(), что немного необычнее... Код проблемы, вероятно, является объявлением метода, например <%! %>


Обновление: я только воспроизвел это, переопределив метод _jspInit(). Это то, что вы делаете? Если это так, не рекомендуется - почему он начинается с _.

Ответ 5

Я изо всех сил старался следовать приведенным выше ответам. Но у меня есть причина для того же.

Примечание. Это для развертывания maven + eclipse + tomcat и проблемы, особенно с spring mvc.

1- Если вы включаете зависимость сервлета и 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.jar и servlet-api.jar будут включены вместе. Таким образом, необходимо исключить, что servlet-api и jsp-api развертываются по мере необходимости в lib в целевом или в "WEB-INF/lib", как указано ниже.

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