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条)

报告相同问题?

悬赏问题

  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 spring后端vue前端
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题