由于不从JSP访问数据库而导致的NullPointerException

时间:2011-08-12 08:34:23

标签: java jsp postgresql nullpointerexception

我正在开发一个使用jdbc驱动程序访问PostgreSQL的项目,并通过中间件处理这些数据,最后通过jsp页面显示/更新。使用Eclipse我创建了一个动态Web项目。然后我为所有后端和中间件操作编写了代码。我可以从静态上下文访问数据库(我的意思是java源代码的主要方法)。如果我不调用任何访问数据库的方法,我也可以使用jsp中的java资源(例如显示)。但是当我尝试访问数据库时,它不起作用并且给我一个空指针异常。

<jsp:useBean id="user" class="dbActionManagement.UserData" scope="session"/> 
<jsp:setProperty name="user" property="*"/> 

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>next page</title>
</head>
<body>

You entered<BR>
Name: <%= user.getUsername() %><BR>
Email: <%= user.getEmail() %><BR>
Age: <%= user.getAge() %><BR>

</body>
</html>

这给了我:

  

SEVERE:servlet [jsp]的Servlet.service()与路径的上下文   [/ GNYSweb]用root引发了异常[java.lang.NullPointerException]   导致java.lang.NullPointerException   dbActionManagement.OfficerManager.getTotalPoint(OfficerManager.java:494)     在dbActionManagement.UserData.getUsername(UserData.java:28)at   org.apache.jsp.NextPage_jsp._jspService(NextPage_jsp.java:80)at   org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)at   javax.servlet.http.HttpServlet.service(HttpServlet.java:722)at at   org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419)     在   org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:391)     在org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)     在javax.servlet.http.HttpServlet.service(HttpServlet.java:722)at   org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)     在   org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)     在   org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)     在   org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)     在   org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)     在   org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)     在   org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)     在   org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)     在   org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)     在   org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)     在   org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)     在   org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:188)     在   org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run(JIoEndpoint.java:302)     在java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(未知   来自java.util.concurrent.ThreadPoolExecutor $ Worker.run(未知   来自java.lang.Thread.run(未知来源)

我正在使用的java类是UserData和方法getUserName()

public String getUsername() { 
        int a = new OfficerManager().getTotalPoint("a");
        return new Integer(a).toString(); 
}

OfficerManager有一个默认构造函数,getTotalPoint是

public int getTotalPoint(String officerId){
    int point = 0;
    ResultSet results = null;
    try {
        if(DBConnection.db.isClosed()){ // problem is caused by this line 
            DBConnection.connect(); 
        }
        Statement sql = DBConnection.db.createStatement();
                String sqlText = "select point from officers ";

            sqlText += " where sicilno = '" + officerId + "'";
        results = sql.executeQuery(sqlText);

    } catch (SQLException e) {
        e.printStackTrace();

    }
    if(results != null)
        try {
            while(results.next()){
                point = (int) results.getDouble("point");

            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

    return point;
}

我已将postgreSQL jdbc驱动程序添加到我的构建路径中。我还在Tomcat的lib文件夹中包含了相同的jdbc驱动程序。此外,我在localhost使用Tomcat v7.0的实例,其位置是[工作区元数据]

2 个答案:

答案 0 :(得分:1)

我理解这个问题,它基本上是我试图达到null的Connection对象。我使用静态对象访问数据库,我忘了在使用之前初始化它们。有几个解决方案,最基本的是在UserData类中编写另一个方法,名为startConnection()

public void startConnection(){
    new DBConnection("myDBName", "myUserName", "myPassword");
}

并从jsp页面调用此方法

...
<body>
<% user.startConnection(); %>
Name: <%= user.getUsername() %><BR>
</body>
...

这样我可以在使用之前正确初始化我的DBConnection类实例。谢谢你的帮助。

答案 1 :(得分:0)

在创建连接之前,请避免检查数据库是否已关闭,注释掉:

 //if(DBConnection.db.isClosed()){ // problem is caused by this line 
        DBConnection.connect(); 
  //  }

然后在使用它之后以及发生异常时关闭连接。您的例外块应更改为;

catch (SQLException e) 
{
 e.printStackTrace();
 if((DBConnection !=null) && DBConnection.db !=null && !DBConnection.db.isClosed())
    {
      BConnection.db.close(); 
    }
}

并在使用后直接在try块中关闭它。

根据经验 - 在尝试关闭连接之前,请检查连接是否为空。 尝试做这样的事情:

if((DBConnection !=null) && DBConnection.db !=null && DBConnection.db.isClosed())
{
  DBConnection.connect(); 
}