今天一个朋友问了我个java连接数据库的问题, 他说, 他做了一个jdbc的工程,用来控制一些html静态页面批量生成, 在本地运行都很顺利,页面也能生成出来,  可部署到服务器上就出现了问题: 异常信息如下:java.lang.NullPointerException
oracle.jdbc.driver.OracleResultSetImpl.internal_close(OracleResultSetImpl.java:627)
oracle.jdbc.driver.OracleResultSetImpl.close(OracleResultSetImpl.java:118)
com.publish.dao.SmSoftProductSelectImpl.getRecommandVosBysmTypeId(SmSoftProductSelectImpl.java:287)
com.publish.service.HtmlService.getSmLinkVosBysmTypeId(HtmlService.java:146)
com.publish.service.HtmlService.createMoreHtml(HtmlService.java:580)
com.publish.build.createHtml.doPost(createHtml.java:111)
javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)据他所说也并不是一部署到服务器就出现了问题, 而是运行过程中出现的这个问题,  本地和服务器环境一样,Oracle版本也是一样, 看了他的程序,也很迷糊, 因为时间很仓促,我也没再去帮他调试了,自己手头上一大堆活,在google 上搜了下,回答都很抽象, 所以请各位有经验的大哥帮帮忙, 看一下这个问题主要是尤什么诱发的谢谢啦..
(注:
com.publish.dao.SmSoftProductSelectImpl.getRecommandVosBysmTypeId(SmSoftProductSelectImpl.java:287)
if(rs!=null){
try {
rs.close();    // 这里就是 287行,但为什么这里会报空指针,请作解释
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
)
感触:  工作两年了,却被这个jdbc迷糊了, 深感羞愧.......

解决方案 »

  1.   

    忘了说明下
    rs 是  ResultSet 对象...
      

  2.   

    if(rs!=null){
    try {
    rs.close();    // 这里就是 287行,但为什么这里会报空指针,请作解释
    } catch (SQLException e) { 有可能吗?这里的rs已经不可能是null了吧,if(rs!=null)这不是判断了吗?
      

  3.   

    google太牛逼了,刚发的贴,现在搜 oracle.jdbc.driver.OracleResultSetImpl.internal_close 和 oracle.jdbc.driver.OracleResultSetImpl.close 结果这个贴排第一位....大伙快支招啊,  嫌分少了的可以提出给加就是,不差分
      

  4.   

    得把finally语句全部贴出来
    如果你先关conn或者ps,rs!=null,但是rs已经被关闭了噢
      

  5.   

    对于上楼同志的说法可以排除了...finally{
    if(rs!=null){
    try {
    rs.close();
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    if(sta!=null){
    try {
    sta.close();
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    JDBCAccess.closeConnnection(conn);
    }
      

  6.   

    rs.close()方法里面还可以调用其它的呀,你能打开OracleResultSetImpl源代码看看就知道了
      

  7.   

    com.publish.service.HtmlService.getSmLinkVosBysmTypeId(HtmlService.java:146) 
    com.publish.service.HtmlService.createMoreHtml(HtmlService.java:580) 
    com.publish.build.createHtml.doPost(createHtml.java:111) 
    这几行也可能是空
      

  8.   

    这样写看看
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;public class DBCon {
    public static String driver="oracle.jdbc.driver.OracleDriver";
    public static String url="jdbc:oracle:thin:@192.168.0.174:1521:ORCL";
    public static String user="scott";
    public static String pwd="tiger";

    public static Connection getConnection(){
    try {
    Class.forName(driver);
    Connection con=DriverManager.getConnection(url, user, pwd);
    System.out.println("con success");
    return con;
    } catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    return null;
    }

    public static void close(Connection con,Statement stm,ResultSet rs){
    if(con!=null){
    try {
    con.close();
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    if(stm!=null){
    try {
    stm.close();
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    if(rs!=null){
    try {
    rs.close();
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }

    public static void main(String[] args) {
    DBCon.getConnection();
    }
    }
    Connection con=DBCon.getConnection();
    ......
    finally{
    DBCon.close(con, stm, rs);
    }
      

  9.   

    这里有个疑问, 也是在实际运用中出现的问题,
    这里就拿12楼程序说明:
    对于这个方法:
        public static Connection getConnection(){
            try {
                Class.forName(driver);
                Connection con=DriverManager.getConnection(url, user, pwd);
                System.out.println("con success");
                return con;
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }
    静态的得到一个连接, 毫无疑问,这个方法是正确的,但不知道大家有没有批量生产上万条记录经验,(将数据转换为物理文件), 有个时候生成了上千条的时候就不执行了,好像哪被堵死了一样,文件不在增长,页面也不报异常,log也没显示,就停住了..., 但如果把此方法改成为
    public Connection getConnection(){
      return conn;
    }就可以解决上述问题, 有点怪哉...
    望高人指点....