JDK-6493779 : Using JdbcRowSetImpl(strUrl,strUserId, strPassword) without executing a stmt throws NPE in getType()
  • Type: Bug
  • Component: core-libs
  • Sub-Component: javax.sql
  • Affected Version: 6
  • Priority: P2
  • Status: Closed
  • Resolution: Fixed
  • OS: generic
  • CPU: generic
  • Submitted: 2006-11-15
  • Updated: 2010-04-03
  • Resolved: 2008-01-10
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 6 JDK 7
6u1 b01Fixed 7Fixed
Description
It appears that at line 2097 in JdbcRowSetImpl.java (which I think is int rstype = rs.getType()) a NPE is thrown even though I setType() for JdbcRowSetImpl to ResultSet.TYPE_FORWARD_ONLY. This is because when using the constructor JdbcRowSetImpl(strUrl,strUserId, strPassword) without executing a statement, ResultSet is null and its type is also null. So calling getType(), even though it was set before throws NPE.

TEST SRC SNIPPET:

111            jrs1 = new JdbcRowSetImpl(strUrl,strUserId, strPassword);
112            jrs1.setType(ResultSet.TYPE_FORWARD_ONLY);
113            logMsg("Type set to: "+ ResultSet.TYPE_FORWARD_ONLY);
114
115            logMsg("Type is: "+ResultSet.TYPE_FORWARD_ONLY);
116
117            if(jrs1.getType() == ResultSet.TYPE_FORWARD_ONLY) {
118                logMsg("Test for Type passes...");
119            } else {
120                logMsg("Test for Type fails...");
121                throw new TestFailureException("JdbcRowSet test fails");
122            }
123        } catch (SQLException sqle) {
124            logErr("SQL Exception encountered " + sqle.getMessage());
125            throw new TestFailureException("JdbcRowSet Test failed", sqle);
126        } catch (Exception e) {
127            logErr("Unexpected Exception " + e.getMessage());
128            throw new TestFailureException("JdbcRowSet Test failed", e);
129        }


SRC SNIPPET:

    /**
     *
     * Returns the fetch size for this
     * <code>ResultSet</code> object.
     *
     * @return the current fetch size for this rowset's <code>ResultSet</code> object
     * @throws SQLException if a database access error occurs
     *            or this rowset does not currently have a valid connection,
     *            prepared statement, and result set
     */
    public int getType() throws SQLException {
        try {
             checkState();
        } catch(SQLException sqle) {
            return super.getType();
        }
        try {
            int rstype = rs.getType();
            return rstype;
        } catch(NullPointerException npe) {
             throw new SQLException("Cannot return the type of a closed ResultSet : " + npe);
        }

    }

OUTPUT:

[2006-11-14T18:37:11.58] SQL Exception encountered Cannot return the type of a closed ResultSet : java.lang.NullPointerException
[2006-11-14T18:37:12.48] Error: JdbcRowset2_012 : JdbcRowSet Test failed
[2006-11-14T18:37:12.48] com.sun.j2se_sqe.jdbc.utils.TestFailureException: JdbcRowSet Test failed
[2006-11-14T18:37:12.48]        at JdbcRowset2_012.doTest(JdbcRowset2_012.java:125)
[2006-11-14T18:37:12.48]        at JdbcRowset2_012.main(JdbcRowset2_012.java:183)
[2006-11-14T18:37:12.48] Caused by: java.sql.SQLException: Cannot return the type of a closed ResultSet : java.lang.NullPointerException
[2006-11-14T18:37:12.48]        at com.sun.rowset.JdbcRowSetImpl.getType(JdbcRowSetImpl.java:2097)
[2006-11-14T18:37:12.48]        at JdbcRowset2_012.doTest(JdbcRowset2_012.java:117)
[2006-11-14T18:37:12.48]        ... 1 more
[2006-11-14T18:37:12.48] # Test level exit status: 1
[2006-11-14T18:37:12.48] PropertyReader: SQL_DIR_PATH=/home/sandeepk/workspace/7.0/jdbc/4.0_tests/workDir
[2006-11-14T18:37:12.48] PropertyReader: SQL_FILE_NAME=initdb.conf
[2006-11-14T18:37:12.48] PropertyReader: SQL_ABS_PATH=/home/sandeepk/workspace/7.0/jdbc/4.0_tests/workDir/initdb.conf
[2006-11-14T18:37:12.48] Loading the driver class com.inet.ora.OraDriver
[2006-11-14T18:37:12.48] Loading the driver class com.inet.ora.OraDriver
[2006-11-14T18:37:12.48] Starting the test...
[2006-11-14T18:37:12.48] Getting a new Jdbc RowSet
[2006-11-14T18:37:12.48] Coammand  is: Select * from CRS_Objects
[2006-11-14T18:37:12.48] Type set to: 1003
[2006-11-14T18:37:12.48] Type is: 1003

Comments
EVALUATION Fix has been checked into the workspace
27-11-2006