<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="GB18030"%>
<%@ page import = "com.javaee.DAO.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>按ID查询记录</title>
</head>
<body>
<% 
UserDAO userDAO = DAOFactory.getUserDAOInstance();
User user = userDAO.queryById(1);
out.println("用户名:"+user.getUsername()+"<br>");
out.println("密码:"+user.getPassword());
%>
</body>
</html>
UserDAO,user,UserDAOFactory都已经定义,上述代码,为什么老是报错如下,求指教:
严重: Servlet.service() for servlet [jsp] in context with path [/testt] threw exception [java.lang.NullPointerException] with root cause
java.lang.NullPointerException
at org.apache.jsp.ch2.QueryById_jsp._jspService(QueryById_jsp.java:79)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1812)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
七月 09, 2012 9:41:59 下午 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet [jsp] in context with path [/testt] threw exception [java.lang.NullPointerException] with root cause
java.lang.NullPointerException
at org.apache.jsp.ch2.QueryById_jsp._jspService(QueryById_jsp.java:79)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1812)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)

解决方案 »

  1.   

    其中UserDAOImpl.java中queryById如下:
    @Override
    public User queryById(int userid) throws Exception {
    User user = null;
    String sql = "SELETE * FROM user WHERE userid=?";
    PreparedStatement pstmt = null;
    DataBaseConnection dbc = null;
    try{
    dbc = new DataBaseConnection();
    pstmt = dbc.getConnection().prepareStatement(sql);
    pstmt.setInt(1, userid);
    ResultSet rs = pstmt.executeQuery();
    if(rs.next()){
    user = new User();
    user.setUserid(rs.getInt(1));
    user.setUsername(rs.getString(2));
    user.setPassword(rs.getString(3));
    }
    rs.close();
    pstmt.close();
    }catch(Exception e){
    e.getStackTrace();
    }finally{
    dbc.close();
    }
    return user;
    }
      

  2.   

    从代码看,如果查询没有记录,则返回为null,你可以改成:
    if(user==null)
    {
    out.println("user is null");
    }
    else
    {
    out.println("用户名:"+user.getUsername()+"<br>");
    out.println("密码:"+user.getPassword());
    }
      

  3.   

    2 楼正解告诉你一个定位错误的方法,你仔细看异常信息
    里面的这一句
    java.lang.NullPointerException
    at org.apache.jsp.ch2.QueryById_jsp._jspService(QueryById_jsp.java:79)
    这里很清晰的告诉你,异常在QueryById_jsp.java文件的79行。
    你可以去应用服务器的JS缓存目录去找这个文件,如果是tomcat的话,一般在work\Catalina\localhost\你的项目名称\org\apache\jsp\然后就是你QueryById.jsp的文件目录。
      

  4.   

    java.lang.NullPointerException
    at org.apache.jsp.ch2.QueryById_jsp._jspService(QueryById_jsp.java:79)
    到你的tomcat\work子目录中找到QueryById_jsp.java ,看看 79行是什么 ,报空指针异常啦
      

  5.   

    呵呵 补充下,少打了一个字母“P”,应该是应用服务器的JSP缓存目录
      

  6.   

     在数据库中也确实存在userid=1的记录,但这里找不到
      

  7.   

     空指针异常出在这一行:out.println("用户名:"+user.getUsername()+"<br>");
    ResultSet rs = pstmt.executeQuery();
    if(rs.next()){
    user = new User();
    user.setUserid(rs.getInt(1));
    user.setUsername(rs.getString(2));
    user.setPassword(rs.getString(3));
    }
    rs.close();
    pstmt.close();
    }catch(Exception e){
    e.getStackTrace();
    }finally{
    dbc.close();
    }
    debug过程中,发现执行到ResultSet 语句后,直接跳到了异常,并不执行if语言,导致user==null,但不明白为什么不执行,求指教,谢谢
      

  8.   

    那你的查询语句是什么样子的?代码完整些吧,另外建议在遍历ResultSet 先进行null的判断
    所以代码可以改成这样子if(rs!=null&&rs.next()){
    user = new User();
    user.setUserid(rs.getInt(1));
    user.setUsername(rs.getString(2));
    user.setPassword(rs.getString(3));
    }
      

  9.   

    谢谢,我已经找到原因了,UserDAOImpl.java中queryById的SQL语句错误
      

  10.   

    参数太多还是别用statement了吧