我做的是很简单的Struts+Hibernate  现在刚开始 插入数据库的操作 一直不行
出错的界面如下:
exception:javax.servlet.ServletException: java.lang.NullPointerException
org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:535)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:433)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
root cause:        java.lang.NullPointerException
com.sdut.struts.action.StuRegAction.getStudentDAO(StuRegAction.java:16)
com.sdut.struts.action.StuRegAction.execute(StuRegAction.java:39)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)我按照书的例子来做的   就是填写一个表单 存储到数据库里去表单的Action是 StuRegAction(学生注册):
package com.sdut.struts.action;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.sdut.domain.Student;
import com.sdut.struts.form.StuRegForm;
import com.sdut.dao.StudentDAO;
import com.sdut.dao.DAOFactory;
public class StuRegAction extends Action{
  private  StudentDAO stuDao;
  public  StudentDAO getStudentDAO(){
  return DAOFactory.getInstance().createStudentDAO();
  }

public ActionForward execute(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response){
StuRegForm stuRegForm=(StuRegForm)form;
Student stu= new Student();
String username=stuRegForm.getUsername();
String name=stuRegForm.getName();
String password=stuRegForm.getPassword();
String sex=stuRegForm.getSex();
String tel=stuRegForm.getTel();
String email=stuRegForm.getEmail();
String department=stuRegForm.getDepartment();
String grade=stuRegForm.getGrade();
stu.setUsername(username);
stu.setDepartment(department);
stu.setEmail(email);
stu.setName(name);
stu.setSex(sex);
stu.setPassword(password);
stu.setTel(tel);
stu.setGrade(grade);
stuDao=this.getStudentDAO();
if(!stuDao.saveStudent(stu)){
return mapping.findForward("failure");
} else {
return mapping.findForward("success");
}



}

}连接数据库有几个相关的文件daoconfig.properties      DAOconfig.java    DAOfactory.java  HibernateDAOFactory.java其中在DAOfactory.java中 定义了这样的东西:
public abstract StudentDAO createStudentDAO();
在HibernateDAOFactory中 有这样的代码public StudentDAO createStudentDAO(){
return new StudentDAOImp();
}StudentDAOImp实现StudentDAO中定义的函数:
package com.sdut.dao;
import java.util.List;
import com.sdut.domain.Student;
public interface StudentDAO {  
List<?> getStudent();
boolean deleteStudentByID(String id);
Student getStudentByID(String id); 
boolean saveStudent(Student stu);}
StudentDAOImp中是Hibernate访问数据库public List<?> getStudent(){
try{ Session s=HibernateUtil.currentSession();
   HibernateUtil.beginTransaction();
   List<?> results=s.createQuery("from Student stu").list();
   HibernateUtil.commitTransaction();
   HibernateUtil.closeSession();
   if(results!=null&&results.size()>0){
   return results;
   }
}catch(HibernateException e){
log.fatal(e);
}
return null;    
}
public boolean deleteStudentByID(String id){
try{
Session s=HibernateUtil.currentSession();
   HibernateUtil.beginTransaction();
  Student stu=(Student)s.load(Student.class, id);
   HibernateUtil.commitTransaction();
   HibernateUtil.beginTransaction();
   s.delete(stu);
   HibernateUtil.commitTransaction();
   HibernateUtil.closeSession();
   return true;
}catch(HibernateException e){
log.fatal(e);
}
return false;
}
public  Student getStudentByID(String id){
try{Session s=HibernateUtil.currentSession();
       HibernateUtil.beginTransaction();
   Student stu=(Student)s.load(Student.class, id);
   HibernateUtil.commitTransaction();
   HibernateUtil.closeSession();
   return stu;
}catch(HibernateException e){
log.fatal(e);
}
return null;    
} public boolean saveStudent(Student stu){
try{Session s=HibernateUtil.currentSession();
       HibernateUtil.beginTransaction();
   s.saveOrUpdate(stu);
   HibernateUtil.commitTransaction();
   HibernateUtil.closeSession();
   return true;
}catch(HibernateException e){
log.fatal(e);
}
return false;
   

}
    
 

解决方案 »

  1.   


    public class StuRegAction extends Action{
      private StudentDAO stuDao;
      public StudentDAO getStudentDAO(){
            if(DAOFactory.getInstance()==null)
                 System.out.println("--------DAOFactory.getInstance()==null-----------");
            if(DAOFactory.getInstance().createStudentDAO()==null)
                 System.out.println("DAOFactory.getInstance().createStudentDAO()==null");
      return DAOFactory.getInstance().createStudentDAO();
    }
    看看getStudentDAO()到底是在那里得到了null对象,跟进去检查就OK了
      

  2.   

    return DAOFactory.getInstance().createStudentDAO();
    绝对的就是这句返回了null对象啦
    检查你createStudentDAO()方法,debug下就很清楚啦
      

  3.   

    private StudentDAO stuDao=new StudentDAO();
    应该就没错了,要不就是没返回值,分层测试。
      

  4.   

    4楼的朋友  我按你的写了 Myeclipse提示: can not instantiate StudentDAO 不能实例化.另外2楼3楼的大哥 谢谢你们 虽然不是很明白 我再加油找找看吧 哎呀..
      

  5.   

    个人觉得多点用System.out.println();来打印自己想要的信息比较容易发现bug~~
      

  6.   

    头看晕了,
    初步怀疑是因为没有给DAOFactory设置geter,seter方法。