where_is_morty 2011-05-10 00:05
浏览 280
已采纳

一个困扰了我一个多月的问题,关于空指针的。。。请教各位老大。。。

Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:505)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:416)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

root cause

java.lang.NullPointerException
servlet.CountIPShw.doPost(CountIPShw.java:110)
servlet.CountIPShw.doGet(CountIPShw.java:50)
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968)
org.apache.jsp.mng.ipcount_jsp._jspService(ipcount_jsp.java:90)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

[size=medium]servlet.CountIPShw.doPost(CountIPShw.java:110)[/size]代码如下:
ExecuteDB exedb = new ExecuteDB();
ResultSet rs1 = exedb.exeQuery("select count(*) from ip where date != \""+date+"\";");
ResultSet rs2 = exedb.exeQuery("select * from visit;");
ResultSet rs3 = exedb.exeQuery("select count(*) from ip where date = \""+date+"\";");
try {
[size=medium]if(rs1.next()&&rs2.next()){[/size]//这是第110行
if(rs1.getString(1)!=null&&!rs1.getString(1).equals("")){
amount = rs1.getInt(1)+rs2.getInt(1);
exedb.exeSql("update visit set amount = "+amount);
exedb.exeSql("delete from ip where date != \""+date+"\";");
}
}
rs1.close();
rs2.close();
if(rs3.next()){
if(rs3.getString(1)!=null&&!rs3.getString(1).equals(""))today = rs3.getInt(1);
}
rs3.close();
} catch (SQLException e) {
}
exedb.close();
这里的ExecuteDB 类代码如下:
package newshop;

import java.sql.*;

public class ExecuteDB
{
private String userName="****";
private String userPassword="****";
private String url="jdbc:mysql://127.0.0.1:3306/****";
private Connection dbConn;
private Statement stmt;
private ResultSet rs;

private String errMes;

public ExecuteDB()
{
    dbConn = this.getConn();
    stmt = null;
    rs = null;  
    this.errMes = this.getErrMes(); 
}

public Connection getConn()
{       
    try
    { 
        Class.forName("org.gjt.mm.mysql.Driver").newInstance();
        dbConn= DriverManager.getConnection(url,userName,userPassword);
    }
    catch(Exception e)
    {           
        dbConn = null;
        errMes=e.toString();            
    }finally{

    }
    return dbConn;
}

public boolean exeSql(String strSql)
{
    boolean isSuc = false;      
    try
    {
        stmt=dbConn.createStatement();
        stmt.executeUpdate(strSql); 
        isSuc = true;    
    }
    catch(Exception e)
    {
        this.errMes = this.errMes + "<br>" +e.toString();           
    }finally{
    }
    return isSuc;
}

public ResultSet exeQuery(String strSql)
{       
    try
    {
        stmt=dbConn.createStatement();
        rs =stmt.executeQuery(strSql);  
    }
    catch(Exception e)
    {   
        this.errMes = this.errMes + "<br>" +e.toString();   
        rs = null;
    }finally{
    }
    return rs;
}

public void close()
{   
    try {
        stmt.close();   
        dbConn.close();
    } catch (SQLException e) {
        this.errMes = this.errMes + "<br>" +e.toString();   
    }
}

public String getErrMes()
{
    return errMes;
}       

}

  • 写回答

12条回答 默认 最新

  • mavlarn 2011-05-10 17:06
    关注

    你是在程序中对于每个请求自己创建连接,当请求比较多的时候,连接就不够用了。

    而且,你在doPost()里面,当有异常的时候,也没有关闭数据库连接,只有正常结束的情况下才关闭。

    一般数据库连接都是有限制的,你这样自己创建连接肯定不行,当并发请求比较多的时候,数据库就会连接不上,那你执行sql的时候就肯定会出错了。

    你的代码还有一个很大的问题,java里面处理异常,你不能吞了它,而应该把它重新扔出来,最后在doPost之类的方法里面统一处理。在你的代码里,getConn() 方法,已经exeQuery()方法里面的异常你都只是记录,但是没有抛出来,这样,程序出错的时候是空指针,但是实际上错误是在一开始创建连接的时候。就会误导你debug。

    建议使用一些DAO框架,像iBatis、Hibernate之类的,可以提供数据库连接池。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(11条)

报告相同问题?

悬赏问题

  • ¥50 关于#html5#的问题:H5页面用户手机返回的时候跳转到指定页面例如(语言-javascript)
  • ¥15 无法使用此凭据登录,因为你的域不可用,如何解决?(标签-Windows)
  • ¥15 yolov9的训练时间
  • ¥15 二叉树遍历没有报错但无法正常运行
  • ¥15 在linux系统下vscode运行robocup3d上场球员报错
  • ¥15 Python语言实验
  • ¥15 SAP HANA SQL 增加合计行
  • ¥20 用C#语言解决一个英文打字练习器,有偿
  • ¥15 srs-sip外部服务 webrtc支持H265格式
  • ¥15 在使用abaqus软件中,继承到assembly里的surfaces怎么使用python批量调动