ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

HsqldbでNullPointerException

Hsqldb1.7.3.3@WindowsXPの話ですが、

package exam;

import java.sql.Connection;
import java.sql.DriverManager;

public class HsqldbTest
{
    public static void main(String[] args) throws Exception
    {
        Class.forName("org.hsqldb.jdbcDriver");
        Connection con = DriverManager.getConnection("jdbc:hsqldb:test", "sa", "");
        con.close();
    }
}

っていう小さいコードを書いて、ちょっと接続してみようと思ったら、

java.sql.SQLException: General error: java.lang.NullPointerException
    at org.hsqldb.jdbc.jdbcUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.jdbcConnection.<init>(Unknown Source)
    at org.hsqldb.jdbcDriver.getConnection(Unknown Source)
    at org.hsqldb.jdbcDriver.connect(Unknown Source)
    at java.sql.DriverManager.getConnection(DriverManager.java:512)
    at java.sql.DriverManager.getConnection(DriverManager.java:171)
    at exam.HsqldbTest.main(HsqldbTest.java:12)
Exception in thread "main" 

っていう感じでNullPointerExceptionが発生してしまいました。なんか変だなあと思って、「jdbc:hsqldb:test」を「jdbc:hsqldb:aaa」に変更したところ、さくっと動きました。なんでかなぁと思ったら、全然Hsqldbとは関係のないtest.propertiesっていうファイルが既に存在していたせいみたいです。
ちなみに、test.lckは既に存在していても上書きしてしまうので、Hsqldb的には問題ないのですが、test.logが既に存在していた場合は、

java.sql.SQLException: User not found: SA
    at org.hsqldb.jdbc.jdbcUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.jdbcConnection.<init>(Unknown Source)
    at org.hsqldb.jdbcDriver.getConnection(Unknown Source)
    at org.hsqldb.jdbcDriver.connect(Unknown Source)
    at java.sql.DriverManager.getConnection(DriverManager.java:512)
    at java.sql.DriverManager.getConnection(DriverManager.java:171)
    at exam.HsqldbTest.main(HsqldbTest.java:11)
Exception in thread "main" 

みたいなエラーになる可能性もあるようです。さらに、test.scriptが既に存在していた場合は、

java.sql.SQLException: error in script file line: 1 Unexpected token: hogehoge
    at org.hsqldb.jdbc.jdbcUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.jdbcConnection.<init>(Unknown Source)
    at org.hsqldb.jdbcDriver.getConnection(Unknown Source)
    at org.hsqldb.jdbcDriver.connect(Unknown Source)
    at java.sql.DriverManager.getConnection(DriverManager.java:512)
    at java.sql.DriverManager.getConnection(DriverManager.java:171)
    at exam.HsqldbTest.main(HsqldbTest.java:11)
Exception in thread "main" 

のようになる可能性があります。まあ、これはtest.scriptを見れば分かるレベルですけどね。
というわけで、ざくっとググったところ無さそうな情報だったので一応載せときます。
教訓としては、「エラー発生時には分かりやすいメッセージを表示する」てとこですかね。まあ、最初に示したサンプルプログラムは、全くその辺考慮していませんけど(汗
※Hsqldb1.8.0.1を試したところ、test.propertiesを強制的に上書きして「java.sql.SQLException: User not found: SA」のエラーが出るようです。それもどうかと思うが...