0 0

关闭statement时出现NullPointerException10

公司的一个系统出了个很奇怪的问题,方法调用Trace如下:


ABC.java

......
Connection connection = null;
PreparedStatement ps = null;
ResultSet rs = null;
......
try {
    if(A){
        theSQL = "******";
        connection = theContext.theSQLMgr.getDBSession().getConnection(); 
        ps = connection.prepareStatement(theSQL);
        ......
    }
    else{
        theSQL = "******";
        connection = theContext.theSQLMgr.getDBSession().getConnection(); 
        ps = connection.prepareStatement(theSQL);
        ......
    }
} catch (SQLException e) {
	e.printStackTrace();
	throw new DBResourceException(e);
} finally {
        DBUtils.release(theContext, rs, ps, connection);
}

 

DBUtils.java

public static void release(Context context, ResultSet rs, Statement ps, Connection con) {
	if (rs != null) {
	    context.theSQLMgr.getDBSession().releaseResultSet(rs);
	}
	if (ps != null) {
		context.theSQLMgr.getDBSession().releaseStatement(ps);
	}
	if (con != null)
		context.theSQLMgr.getDBSession().releaseConnection(con);
	}

 

DBSession.class

/**
     * Releases preparedStatement from the database.
     * @param statement
     */
    public void releaseStatement(Statement statement) {
    	if (statement != null) {
    		try {
    			statement.close();
    		} catch (SQLException e) {
    			dbSessionLogger.warn("Error:DBSession.releaseStatement", e);
    		}
        }
    }

 

***WrappedStatement.class(implements PreparedStatement)

public void close()
    throws SQLException
  {
    SsaGenericApplication.logDebug(this.name + "--[close]:: closing statemt...");
    if ((!this.inTrans) || (!this.updateQuery))
    {
      this.stmt.close();
      this.stmt = null;
    }
    SsaGenericApplication.logDebug(this.name + "--[close]::statment closed");
  }

 

在最后这个class中就报异常了,信息如下:

10:29:10,414 ERROR [STDERR] Caused by: java.lang.NullPointerException
10:29:10,414 ERROR [STDERR]     at com.***.service.baseobjects.***WrappedStatement.close(Unknown Source)
10:29:10,414 ERROR [STDERR]     at com.agileitp.forte.genericdbms.DBSession.releaseStatement(DBSession.java:202)
10:29:10,414 ERROR [STDERR]     at com.***.service.utils.DBUtils.release(DBUtils.java:36)
10:29:10,414 ERROR [STDERR]     at com.***.service.dcustomize.TransferP1S1.processStep(TransferP1S1.java:297)
10:29:10,414 ERROR [STDERR]     at com.***.service.exeprocessmanager.TransactionService.executeProcedure(Unknown Source)
10:29:10,414 ERROR [STDERR]     at com.***.service.exeprocessmanager.TransactionServiceSOBean.executeProcedure(Unknown Source)
10:29:10,414 ERROR [STDERR]     at sun.reflect.GeneratedMethodAccessor132.invoke(Unknown Source)
10:29:10,414 ERROR [STDERR]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
10:29:10,414 ERROR [STDERR]     at java.lang.reflect.Method.invoke(Method.java:592)
10:29:10,414 ERROR [STDERR]     at org.jboss.invocation.Invocation.performCall(Invocation.java:359)

 

理论上,最后一个class的

this.stmt.close();

 

不可能报错,因为之前已经做过ps!=null的判断了,至此失去思路。

不知错误可能出在哪里?

2012年11月29日 14:48

1个答案 按时间排序 按投票排序

0 0

public void close()
    throws SQLException
  {
    SsaGenericApplication.logDebug(this.name + "--[close]:: closing statemt...");
    if ((!this.inTrans) || (!this.updateQuery))
    {
      this.stmt.close();
      this.stmt = null;
    }
    SsaGenericApplication.logDebug(this.name + "--[close]::statment closed");
  }

估计是你最合格包装的statement的 this.stmt 为null 你可以看看

2012年11月29日 15:49

相关推荐

    总结java程序中操作Oracle数据库的常用操作1

    9. 关闭资源:在完成数据库操作后,必须关闭`ResultSet`,`Statement`和`Connection`,以释放数据库资源。通常使用`try-with-resources`语句块来确保资源被正确关闭。 10. 数据库连接池:在实际应用中,为了提高...

    Java演示常见的数据库异常处理情况.rar

    - `NullPointerException`: 当尝试访问null对象的方法或属性时抛出,可能出现在未正确初始化数据库连接时。 - `ClassNotFoundException`: 在加载数据库驱动时找不到指定类时抛出。 - `IOException`: 数据流读写...

    java开发中的一些常用小技巧

    - **执行新的SQL前关闭之前的Statement**:每执行一条新的SQL语句之前,都需要关闭上一条SQL语句所使用的`Statement`。 ```java stmt.close(); ``` - **提交事务**:所有操作完成后,需要提交事务。 ```java ...

    Java_Jdbc_Hibernate_Struts2_Android_Web异常及其处理办法

    例如,确保正确的驱动程序加载,正确配置连接参数,以及在关闭资源(如Statement和ResultSet)时处理异常。 【Hibernate异常处理】 Hibernate是一个流行的ORM(对象关系映射)框架,允许开发者使用面向对象的方式...

    最基本的Sqlserver数据库连接

    如果在执行查询时遇到`NullPointerException`异常,通常是由于`ResultSet`对象未正确初始化导致的。确保在执行查询前已经正确设置了`Statement`对象,并且成功执行了SQL语句。 #### SQLServerException异常 如果...

    java通讯录连接mysql数据库.docx

    - 为了保证程序的健壮性,应该添加适当的异常处理代码,比如在连接数据库时可能出现的`SQLException`,在处理用户输入时可能出现的`NullPointerException`等。 7. **设计模式**: - 在文档中,`Denglu` 和 `...

    java常见错误集合以及描述

    **描述**:当执行SQL语句时出现错误时会抛出此异常。 **解决方案**: 1. **异常处理**:使用try-catch语句处理SQLException。 2. **参数验证**:对输入参数进行有效性验证。 3. **使用PreparedStatement**:使用...

    java笔试题

    - `try-catch-finally`结构用于捕获和处理程序运行时可能出现的异常。 2. **集合框架**: - 对象具有唯一字符串键的容器应使用`Map`,因为`Map`允许通过键来检索对象,而`Set`、`List`、`Collection`和`...

    35个Java代码性能优化总结.pdf

    在操作数据库时,应使用正确的资源管理策略,比如,在操作完成后及时关闭ResultSet、Statement和Connection对象。 以上是35个常见的Java代码性能优化技巧的总结,实际运用时需要根据具体的应用场景和需求进行适当的...

    Java开发笔试题.doc

    - 运行时异常是程序运行过程中可能出现的、不能被编译器强制捕获的异常,例如空指针异常(NullPointerException)、算术异常(ArithmeticException)等。 - 一般异常(非运行时异常)是可以通过编程时的检查和处理...

    Windchill二次开发数据库连接及操作的两种方式代码

    一旦连接建立,就可以使用`Statement` 或 `PreparedStatement` 对象执行SQL语句,进行数据的查询、插入、更新和删除。这种方法虽然更加灵活,但需要注意的是,直接操作数据库可能会影响Windchill系统的稳定性和性能...

    JAVA工程师面试题

    - NullPointerException:访问或操作null对象时抛出。 - ClassNotFoundException:尝试加载找不到的类时抛出。 - ArithmeticException:进行非法数学运算,如除以零。 - ArrayIndexOutOfBoundsException:数组访问...

    java编程实例

    使用`try-catch-finally`块来捕获并处理可能出现的异常,如`IOException`、`NullPointerException`等,确保程序在遇到错误时能优雅地退出或提供反馈。 4. **集合框架实例** Java集合框架包括ArrayList、LinkedList...

    javase分享

    - `RuntimeException`是运行时异常,包括`NullPointerException`, `NumberFormatException`, `ArrayIndexOutOfBoundsException`, `ClassCastException`, `ArithmeticException`等,通常不需要显式捕获。 - `Check...

    java实现将结果集封装到List中的方法

    在finally块中,`conn.close()`用于关闭连接,但在出现异常时,`conn`可能为null,因此需要进行null检查以防止NullPointerException。 7. **效率优化**: 虽然示例代码能正常工作,但为了提高性能,可以考虑使用`...

    自己总结的Java面试题

    运行时异常是程序运行过程中可能出现的异常,如NullPointerException。 5. **集合框架** - **ArrayList和LinkedList的区别?** ArrayList基于动态数组,访问速度快,插入删除慢;LinkedList基于双向链表,插入删除...

    javabean+jsp分页查询

    在Java中,使用JDBC进行数据库操作包括加载驱动、建立连接、创建Statement或PreparedStatement对象、执行SQL语句、处理结果集以及关闭资源。在分页查询中,可能还需要使用PreparedStatement设置LIMIT子句。 8. **...

    JAVA编程中常用的英文单词词汇汇总.doc

    49. **NullPointerException**:空引用异常,访问空对象时抛出。 50. **ClassNotFoundException**:类没有找到异常,加载类时找不到对应的.class文件。 51. **NumberFormatException**:数字格式异常,解析字符串...

    java程序员初学20道题

    - **运行时异常**:由运行时环境检测到错误而抛出的异常,如`NullPointerException`。 - **错误**:通常表示无法预见的异常情况,如`OutOfMemoryError`。 #### 10. Java语言学习六大要点 Java学习过程中,应重点...

Global site tag (gtag.js) - Google Analytics