A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张晨 黑马帝   /  2011-12-25 22:06  /  2536 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package com.example;

  2. public class Dog {
  3.         private String breed;
  4.         public Dog(String breed) {
  5.         this.breed = breed;
  6.         }
  7.         public String getBreed() {
  8.         return breed;
  9.         }
  10. }
复制代码
  1. package com.example;

  2. import java.io.IOException;
  3. import java.io.PrintWriter;

  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;

  8. public class ListenerTester extends HttpServlet {

  9.        
  10.         public void doGet(HttpServletRequest request, HttpServletResponse response)
  11.                         throws ServletException, IOException {

  12.                 response.setContentType("text/html");
  13.                 PrintWriter out = response.getWriter();
  14.                 out.println("test context attributes set by listener<br>");
  15.                 out.println("<br>");
  16.                 Dog dog = (Dog) getServletContext().getAttribute("dog");
  17.                 out.println("Dog’s breed is: " + dog.getBreed());
  18.         }

  19. }
复制代码
  1. package com.example;

  2. import javax.servlet.ServletContext;
  3. import javax.servlet.ServletContextEvent;
  4. import javax.servlet.ServletContextListener;

  5. public class MyServletContextListener implements ServletContextListener {

  6.         @Override
  7.         public void contextDestroyed(ServletContextEvent event) {
  8.                 ServletContext sc = event.getServletContext();
  9.                 String dogBreed = sc.getInitParameter("breed");
  10.                 Dog d = new Dog(dogBreed);
  11.                 sc.setAttribute("dog", d);
  12.         }

  13.         @Override
  14.         public void contextInitialized(ServletContextEvent arg0) {
  15.                 // TODO Auto-generated method stub

  16.         }

  17. }
复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="3.0"
  3.         xmlns="http://java.sun.com/xml/ns/javaee"
  4.         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5.         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  6.         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  7.   <display-name></display-name>
  8.   <servlet>
  9.     <servlet-name>ListenerTester</servlet-name>
  10.     <servlet-class>com.example.ListenerTester</servlet-class>
  11.   </servlet>

  12.   <servlet-mapping>
  13.     <servlet-name>ListenerTester</servlet-name>
  14.     <url-pattern>/ListenTest.do</url-pattern>
  15.   </servlet-mapping>       
  16.   <welcome-file-list>
  17.     <welcome-file>index.jsp</welcome-file>
  18.   </welcome-file-list>
  19.   
  20.   <context-param>
  21.         <param-name>breed</param-name>
  22.         <param-value>Great Dane</param-value>
  23.   </context-param>
  24.   <listener>
  25.         <listener-class>
  26.           com.example.MyServletContextListener
  27.         </listener-class>
  28.   </listener>
  29.   
  30. </web-app>
复制代码
这个webapp是测试listener的,但总是出现空指针异常,自己找了很久,没找出错误来,望各位鼎力相助。



http://localhost:8080/ListenerTest/ListenTest.do
HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

java.lang.NullPointerException
        com.example.ListenerTester.doGet(ListenerTester.java:22)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
note The full stack trace of the root cause is available in the Apache Tomcat/6.0.33 logs.

Apache Tomcat/6.0.33

2 个回复

倒序浏览
本帖最后由 刘海涛 于 2011-12-26 19:05 编辑

com.example.ListenerTester.doGet(ListenerTester.java:22) 错误
Dog dog = (Dog) getServletContext().getAttribute("dog")
说明 dog == null

如果dog ==null 再去调用该空对象的方法是报NullPointException


你代码写错地方了,初始化代码写在 contextInitialized  而contextDestroyed是在web应用退出的时候调用的。
下面是改写的代码。楼主可以测试下。
  1. package com.example;


  2. import javax.servlet.ServletContext;

  3. import javax.servlet.ServletContextEvent;

  4. import javax.servlet.ServletContextListener;


  5. public class MyServletContextListener implements ServletContextListener {


  6.         @Override

  7.         public void contextDestroyed(ServletContextEvent event) {

  8.                  
  9.         }


  10.         @Override

  11.         public void contextInitialized(ServletContextEvent event) {

  12.                 ServletContext sc = event.getServletContext();

  13.                 String dogBreed = sc.getInitParameter("breed");

  14.                 Dog d = new Dog(dogBreed);

  15.                 sc.setAttribute("dog", d);

  16.         }


  17. }
复制代码

点评

非常感谢  发表于 2011-12-26 19:21

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
张晨 黑马帝 2011-12-26 19:20:11
藤椅
哈,非常感谢{:soso_e100:},程序通过调试,是我粗心大意了,浪费3个小时
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马