下面是我操作数据库的函数,执行的时候,偶尔会出现错误,具体情况如下:
函数中的try语句中,我写了一个if(rst==null)用于判断rst是否为空,并且在该if语句中设置了断点,这个断点从来都没有进去过。
但是,这个函数执行的时候,经常会进入catch中报错,我在catch中设置了断点,发现rst是null,并且,con不是空,这个实在奇怪,既然我的if(rst==null)中的语句没有被执行,怎么会出错呢?
我将sql语句放到mysql数据库中执行,结果正常,不出错。public static ResultSet getrst(String sql)
{
boolean bSuccess = true;
Statement stmt = null;
ResultSet rst = null;
PreparedStatement prestmt = null;
Connection con = getcon();
if (con == null)
bSuccess = false;
if (bSuccess)
{
try
{
//prest = con.prepareStatement("use chatroom");
//stmt = con.createStatement();
//prest.executeQuery();
//rs = stmt.executeQuery(sql);
prestmt = con.prepareStatement(sql);
rst = prestmt.executeQuery();
if(rst==null)
{
int a=0;
a++;
}
} catch (Exception e)
{
//e.printStackTrace();
bSuccess = false;
}
}
if (bSuccess)
return rst;
else
return null;
}

解决方案 »

  1.   

    我在catch中设置了断点,看到e的结果如下:
    com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: ** BEGIN NESTED EXCEPTION ** java.net.SocketException
    MESSAGE: socket closedSTACKTRACE:java.net.SocketException: socket closed
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:129)
    at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:113)
    at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:160)
    at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:188)
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1994)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2411)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2916)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
    at com.mysql.jdbc.Connection.execSQL(Connection.java:3283)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1332)
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1467)
    at book.chat.util.DbManager.getResultSet(DbManager.java:50)
    at book.chat.servlet.dispatchmessage.doGet(dispatchmessage.java:56)
    at book.chat.servlet.dispatchmessage.doPost(dispatchmessage.java:94)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:619)
    ** END NESTED EXCEPTION **Last packet sent to the server was 0 ms ago.
      

  2.   

    if(rst==null || rst.equals(""))
      

  3.   

    Connection con = getcon();
    这个getcon()这个方法应该在本类里的static静态。
    如果这个没错。
    你在判断结果集的时候不该用==NULL
    改用.next()这个方法来判断是不是有结果集。
      

  4.   

    3楼高手:
    Connection con = getcon();是本类的静态。
    感谢你的指教!
    另外,我想问一下,根据我在1楼发的错误提示,是不是能说明rst没有得到的原因:因为con没有连接上。
      

  5.   

    杯具
     多看看API吧
     executeQuery
    ResultSet executeQuery()
                           throws SQLException在此 PreparedStatement 对象中执行 SQL 查询,并返回该查询生成的 ResultSet 对象。 返回:
    包含该查询生成的数据的 ResultSet 对象;不会返回 null 
    抛出: 
    SQLException - 如果发生数据库访问错误,在关闭的 PreparedStatement 上调用此方法,或者 SQL 语句没有返回 ResultSet 对象
      

  6.   

    不会返回null
     懂了撒???