java.lang.NullPointerException空指针错误调试

来源:互联网 发布:php中面向对象的机制有 编辑:程序博客网 时间:2024/06/05 03:34

本文转载连接: http://blog.csdn.net/linjingj/article/details/7420067



(1)问题介绍

修改物料,部分功能描述如下:

选择需要修改的物料,单击修改按钮,调用ShowModifyItemServlet进行一系列设置,并转发到物料修改页面item_modify.jsp。

在这个过程中,出现错误,打印堆栈如下:

四月 01, 2012 5:35:52 下午 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet [ShowModifyItemServlet] in context with path [/drp5.0] threw exception
java.lang.NullPointerException
 at com.ys.drp.basedata.web.ShowModifyItemServlet.service(ShowModifyItemServlet.java:43)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)……

(2)问题分析

由打印的堆栈错误可以看出:

抛出错误:Servlet.service() for servlet [ShowModifyItemServlet] in context with path [/drp5.0] threw exception

错误类型:java.lang.NullPointerException,空指针错误

出现错误的位置:com.ys.drp.basedata.web.ShowModifyItemServlet.service(ShowModifyItemServlet.java:43)

 ShowModifyItemServlet代码如下:

[java] view plain copy
  1. <span style="font-size:18px;">public class ShowModifyItemServlet extends AbstractItemServlet {  
  2.     private DataDictManager dataDictManager;  
  3.       
  4.     @Override  
  5.     public void init() throws ServletException {  
  6.         dataDictManager = DataDictManager.getInstance();  
  7.     }  
  8.   
  9.     @Override  
  10.     protected void service(HttpServletRequest request, HttpServletResponse response)  
  11.             throws ServletException, IOException {  
  12.         //取得物料代码  
  13.         String itemNo = request.getParameter("itemNo");  
  14.           
  15.         //根据物料代码查询  
  16.     。   Item item = itemManager.findItemById(itemNo);  //在此处设置断点  
  17.           
  18.         //将物料信息设置到request中  
  19.         request.setAttribute("item", item);  
  20.         //...     
  21.         //转发(传递数据)  
  22.         request.getRequestDispatcher("/basedata/item_modify.jsp").forward(request, response);  
  23.     }  
  24. }</span>  

在上面所示断点位置,设置断点,运行结果如下:

itemManager = null,找到了空指针的对象,堆栈中打印的空指针错误,便由此而来。

(3)改错

Ctrl+鼠标左键,进入itemManager,代码如下:

[java] view plain copy
  1. <span style="font-size:18px;">public abstract class AbstractItemServlet extends HttpServlet {  
  2.       
  3.     protected ItemManager itemManager;  
  4.       
  5.     @Override  
  6.     public void init() throws ServletException {  
  7.         BeanFactory beanFactory = (BeanFactory)this.getServletContext().getAttribute("beanFactory");  
  8.         itemManager = (ItemManager)beanFactory.getServiceObject(ItemManager.class);  
  9.     }  
  10. }</span>  

在抽象类的init()方法中创建itemManager。

再来看我们上面的代码,ShowModifyItemServlet继承抽象类,而且ShowModifyItemServlet也有自己的init()方法。因此,在运行时,子类的init()方法就把父类的init()方法给覆盖掉了,就出现了我们上面的情况。

修改子类的init()方法,加入super.init(),如下:

[java] view plain copy
  1. <span style="font-size:18px;">  public void init() throws ServletException {  
  2.         dataDictManager = DataDictManager.getInstance();  
  3.         super.init();  
  4.     }</span>  

这次的运行结果有值了:

(4)结果

继续运行,页面终于出来了。


原创粉丝点击