HSQLDB连接同时抛出SQLException和HsqlException

时间:2014-11-19 19:24:53

标签: java hsqldb

我正在为我的高中做一个应用程序,我有以下情况:

我将使用嵌入式HSQL数据库来存储我的应用程序数据。当我打开连接时,我尝试仅在存在的情况下连接到数据库,因此如果它不存在则不会创建。基本上,如果抛出HsqlException,将调用创建数据库,表和约束的函数。

重点是这一行:

Connection c = DriverManager.getConnection(url, user, pwd);

抛出SQLException和HsqlException。但是如果我试图捕捉并控制它们,输出就会像这样:

run:
2014-11-19T20:15:25.142+0100  SEVERE  could not reopen database
Catched an Hsql or SQL Exception. //This is my 'control' over the Exceptions.
org.hsqldb.HsqlException: La base de datos no existe: C:/Databases/DB
    at org.hsqldb.error.Error.error(Unknown Source)
    at org.hsqldb.error.Error.error(Unknown Source)
    at org.hsqldb.persist.Logger.open(Unknown Source)
    at org.hsqldb.Database.reopen(Unknown Source)
    at org.hsqldb.Database.open(Unknown Source)
    at org.hsqldb.DatabaseManager.getDatabase(Unknown Source)
    at org.hsqldb.DatabaseManager.newSession(Unknown Source)
    at org.hsqldb.jdbc.JDBCConnection.<init>(Unknown Source)
    at org.hsqldb.jdbc.JDBCDriver.getConnection(Unknown Source)
    at org.hsqldb.jdbc.JDBCDriver.connect(Unknown Source)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at DBManager.DBManager.main(DBManager.java:20)

BUILD SUCCESSFUL (total time: 0 seconds)

最后这是我的代码。我希望有人打电话告诉我为什么会这样。

package DBManager;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class DBManager {
    static Connection c;
    static Statement stm;
    public static void main(String[] args){
        try {

            Class.forName("org.hsqldb.jdbc.JDBCDriver");
            c = DriverManager.getConnection("jdbc:hsqldb:file:C:/Databases/DB;create=false", "SA", "");         

        } catch (ClassNotFoundException ex) {
            System.out.println("ClassNotFoundException has been catched.");
        } catch (SQLException | org.hsqldb.HsqlException ex) {
            System.out.println("Catched an Hsql or SQL Exception.");
            //TODO call connection where the database is created.
            //TODO create schema CreateSchema.run(c);
            //TODO create constraints
        } finally {
            //TODO
        }
    }


   private static class CreateSchema{
       public static void run(Connection con){
           //TODO: Create table queries.
       }
   } 
}

1 个答案:

答案 0 :(得分:0)

假设您在C:/ Databases / DB中还没有HSQLDB数据库,那么这就像我期望的那样。您的连接字符串告诉它不创建数据库(如果它不存在),因此它不能返回异常,因此它会引发您正在捕获并记录的异常。

因为捕获了异常,所以运行被认为是成功的,因为main方法没有抛出异常或者使用非零值调用System.exit()。

您捕获的异常实际上是SQLException而不是HsqlException(它是RuntimeException) - SQLException具有嵌套的HsqlException。如果您打印异常(ex.printStackTrace())的堆栈跟踪,您可以看到这一点。所以你应该抓住SQLException。

您看到的额外输出来自HSQLDB驱动程序类 - 如果您查看org.hsqldb.Database#reopen()的来源,您可以看到它调用logger.logSevereEvent("could not reopen database", e);以及负责额外输出的内容你看。它尝试使用日志框架(如果有)并默认为JDK中的日志框架,如果未配置,将打印到System.err。