我在第27行和第28行分别得到nullpointer异常的任何具体原因



对象创建位置出现空指针异常在此处创建一个c对象并将其传递给注册方法获取空指针异常

我已经评论了出现空指针异常的两行。

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.bookstore.formbeans.RegistrationActionForm;
import com.bookstore.pojo.Customer;
import com.bookstore.service.CustomerService;
public class RegistrationAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
String status ="";
RegistrationActionForm actionForm= (RegistrationActionForm) form;
Customer c = new Customer();
c.setCno(actionForm.getCno());
c.setCname(actionForm.getCname());
c.setCphon(actionForm.getCphon());
c.setCaddr(actionForm.getCaddr());

CustomerService cService = new CustomerService();
//status = cService.registration(c);
return mapping.findForward(status);
}
}
import com.bookstore.pojo.Customer;
import com.bookstore.util.HibernateUtil;
public class CustomerService {
public String registration(Customer c){
String status="";
Transaction tx = null;
try {
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession();
Customer c1 = (Customer)session.get(Customer.class, c.getCno());
if(c1 == null){
tx = session.beginTransaction();
session.save(c);
tx.commit();
status="success";
}else{
status = "existed";
}
} catch (Exception e) {
//tx.rollback();
status = "failure";
e.printStackTrace();
}
return status;
}
}

尝试用不同的方法实例化

第一行注释:不可能本身就是NPE的原因。实际的NPE采用registration方法。

第二行注释:因为tx为空。如果发生异常,它将是。例如在getSessionFactory()中。

限制你的try语句。在这里,您的异常清楚地假设session.save(c)将失败,并且没有其他解释。但这显然是错误的:在尝试块中有更多的行,它们都可能失败。如果你要假设一个特定的行或错误发生在这样的广义异常块中,那么try块应该只包含。

此外,当异常处理程序内部发生异常时,导致一切结束的异常将消失。因此,您现在无法判断是哪一行将您带到了异常处理程序。解决这个问题——例如,暂时说出tx.rollback(),看看会发生什么,你就会知道更多。为了正确修复此代码,try/catch应该包装session.save(c); tx.commit(),而不包装其他内容。

还要注意,tx.rollback()本身也可以抛出。

一般来说,这种异常处理模式(捕获它,获取大部分信息并将其放入垃圾箱,将堆栈跟踪打印到System.err(这不是日志记录的方式(,设置一个非常普通的"失败"状态,然后继续进行,就好像没有出任何问题一样(已经崩溃了。如果出现异常,请接受它。registration方法应该抛出一些东西,而不是吞下异常。一般来说,如果它确实休眠了一些东西,抛出SQLException是可以的。总比罚款好,你应该这样做。

相关内容

最新更新