[pgsql-jp: 29424] Re: JDBCのprevious メソッドでNullPointerException が発生します

bxcel bxcel @ prophet.jp
2003年 3月 16日 (日) 22:50:34 JST


松本です。

再現させる事が出来ましたので報告します。

テスト用データベース作成
------------ここから-------------------
test=# CREATE TABLE test (id int);
CREATE TABLE
test=# INSERT INTO test VALUES(1);
INSERT 956362 1
test=# INSERT INTO test VALUES(2);
INSERT 956363 1
test=# INSERT INTO test VALUES(3);
INSERT 956364 1
------------ここまで-------------------

テストプログラム(previous.java)
------------ここか
ら-------------------------------------------------------------
import java.io.*;
import java.sql.*;

public class previous {

    public static void main(String arg[]) throws Exception {

        Connection con = null;
        Statement stmt = null;
        ResultSet rs = null;

        Class.forName("org.postgresql.Driver");
        con = DriverManager.getConnection("jdbc:postgresql://localhost/test"
, "postgres", "password");
        stmt = con.createStatement();

        rs = stmt.executeQuery("SELECT id FROM test ORDER BY id");
        rs.afterLast();

        while( rs.previous() ){
            System.out.println(rs.getString("id"));
        }
        return;
    }
}
------------ここま
で-------------------------------------------------------------

$ java previous
Exception in thread "main" java.lang.NullPointerException
        at java.lang.System.arraycopy(Native Method)
        at
org.postgresql.jdbc2.AbstractJdbc2ResultSet.previous(AbstractJdbc2ResultSet.
java:480)
        at previous.main(previous.java:19)

rs.afterLast()をrs.last()に変更すると発生しませんが、この方式では
当然ながら最終レコードが処理できません。

$ java previous
2
1

プログラムで対処可能なのですがご報告まで。

と、ここまで書いて思ったのでずか、afterLastの位置からprevious
メソッドは実行してはいけないのでしょうか?
レコードセットを取得した状態はbeforeFirstの位置でありnext
メソッドを呼び出してから処理を行なうので問題ないと考えてい
ました。

> 松本と申します。
>
> PostgreSQL7.3用のJDBCドライバについて教えてください。
>
> 環境
> JDK 1.3.1_06-b01
> PostgreSQL7.3.2
> RedHat Linux 7.2
> jakarta-tomcat-4.0.6
>
> http://jdbc.postgresql.org/download.html
> からJDBCドライバ(pg73jdbc2.jar)をダウンロードしました。
>
> JDBCで接続してpreviousメソッドを実行すると
>
> java.lang.NullPointerException
>         at java.lang.System.arraycopy(Native Method)
>         at
> org.postgresql.jdbc2.AbstractJdbc2ResultSet.previous(AbstractJdbc2
> ResultSet.
> java:480)
>
> が発生します。pg73jdbc2ee.jarでも同様の現象でした。
>
> 試しにPostgreSQLは7.3.2のままで7.2用のJDBCドライバ
> (pg72jdbc2.jar)で確かめてみると、正しく動作しました。
>
> 同様の現象で対策された情報をお持ちの方、及び
> PostgreSQL7.3.2と7.2用JDBCドライバの運用で問題に
> 遭遇された情報をお持ちの方いらっしゃいましたら
> 教えて頂きたくお願い申し上げます。




pgsql-jp メーリングリストの案内