2010-02-23 43 views
27

Tôi gặp lỗi sau, vấn đề có thể là gì?Tại sao Servlet.service() cho servlet jsp ném ngoại lệ này?

mô tả bối cảnh của tôi:

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

Dường như nó đến từ tập tin index.jsp youy, có thể giúp bạn trong quá khứ nó? – Kartoch

Trả lời

33

Có thể do sự lây nhiễm của classpath. Kiểm tra xem bạn /WEB-INF/lib không chứa một cái gì đó như jsp-api-*.jar.

+0

Xóa thủ công tệp jar đã giải quyết được sự cố. Cảm ơn bạn. – tkt986

+2

thx đây là trường hợp của tôi, làm thế nào tôi có thể tránh điều này xảy ra lần nữa? – tomasb

+0

Tôi có cùng một vấn đề, nhưng ngay cả sau khi loại bỏ các tập tin nó vẫn ném cùng một ngoại lệ. Tôi sẽ đánh giá cao nếu bạn có thể giúp tôi, câu hỏi của tôi là tại http://stackoverflow.com/questions/22086406/why-am-i-receiving-nullpointerexception-on-my-jsp-file – AlexCartio1

2

Vấn đề là trong JSP của bạn, nhiều khả năng bạn đang gọi một phương thức trên một đối tượng mà là null khi chạy.

Nó đang xảy ra trong _jspInit() cuộc gọi, đó là không bình thường nhiều hơn một chút ... mã vấn đề có lẽ là một phương pháp kê khai như <%! %>


Cập nhật: Tôi đã chỉ sao chép này bằng cách ghi đè phương thức _jspInit(). Đó là những gì bạn đang làm? Nếu vậy, nó không được khuyến khích - đó là lý do tại sao nó bắt đầu bằng _.

5

Tôi gặp lỗi này; nó xảy ra một cách tự nhiên, và trang sẽ tạm dừng trong trình duyệt ở giữa một thẻ HTML (không phải là một phần của mã). Điều đó thật khó hiểu!

Biến ra, tôi để một biến đi ra khỏi phạm vi và thu gom rác quét nó đi và sau đó tôi đã cố gắng sử dụng nó. Vì vậy, thời gian dường như ngẫu nhiên.

Để cung cấp cho một ví dụ cụ thể hơn ... Bên trong một phương pháp, tôi đã có cái gì đó như:

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

Bây giờ trong trang JSP của tôi, tôi gọi là phương pháp đó và sử dụng danh sách đối tượng được trả về bởi nó. Đối tượng List được hỗ trợ bởi mảng "foos" đó; nhưng, mảng đã đi ra khỏi phạm vi khi tôi trở về từ phương thức (vì nó là một biến cục bộ). Vì vậy, ngay sau khi trở về, bộ thu gom rác đã quét sạch mảng "foos" và quyền truy cập của tôi vào Danh sách đã gây ra NullPointerException vì mảng cơ bản của nó giờ đã bị xóa sổ.

Tôi thực sự tự hỏi, như tôi đã viết phương pháp trên, cho dù điều đó sẽ xảy ra.

Vấn đề cơ bản còn sâu sắc hơn là tối ưu hóa sớm. Tôi muốn một danh sách, nhưng tôi biết mình sẽ có 20 phần tử chính xác, vì vậy tôi nghĩ mình sẽ cố gắng hiệu quả hơn new ArrayList<Foo>(20) chỉ đặt kích thước ban đầu là 20 nhưng có thể kém hiệu quả hơn phương pháp tôi đã sử dụng. Vì vậy, tất nhiên, để sửa chữa nó, tôi chỉ tạo ra ArrayList của tôi, điền nó lên, và trả lại nó. Không có lỗi lạ hơn.

13

Nếu dự án của bạn dựa trên Maven, hãy nhớ đặt phạm vi để cung cấp cho các phụ thuộc như servlet-api, jsp-api. Nếu không, các lọ này sẽ được xuất sang WEB-INF/lib và do đó gây ô nhiễm với những máy chủ Tomcat. Điều đó gây ra các vấn đề đau đớn.

<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

tôi đã đặt phạm vi như có thể thấy ở trên nhưng nó vẫn đang xảy ra, bất kỳ gợi ý nào khác? – tomasb

+0

Điều này làm việc hoàn hảo cho tôi. Cảm ơn! – Michel

1

Tôi đã cố hết sức để làm theo các câu trả lời được đưa ra ở trên. Nhưng tôi có lý do dưới đây cho cùng.

Lưu ý: Đây là việc triển khai maven + eclipse + tomcat và sự cố phải đối mặt đặc biệt với mvc mùa xuân.

1- Nếu bạn bao gồm phụ thuộc servlet và jsp, vui lòng đánh dấu chúng được cung cấp trong phạm vi.

<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. Có thể bạn có thể bao gồm JSTL là phụ thuộc. Vì vậy, jsp-api.jarservlet-api.jar sẽ được bao gồm. Vì vậy, yêu cầu loại trừ servlet-api và jsp-api đang được triển khai theo yêu cầu lib trong đích hoặc trong "WEB-INF/lib" như được đưa ra dưới đây.

    <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> 
    
Các vấn đề liên quan