JDBC-SQLite应用程序的调试和运行配置期间的结果不同

时间:2011-01-21 07:40:12

标签: java debugging sqlite

/ *问题回答* /

嗨,我正在使用Eclipse 3.6.1(Helios),我通过JDBC接口使用SQLite数据库。问题是我在Debug和Run模式下得到了不同的结果。以下是测试用例:

public static void main(String[] args){
    String db_name = /* path to some SQLite database */;
    try {
        // If we using ch-werner SQLite Java Wrapper/JDBC Driver
        Class.forName("SQLite.JDBCDriver");

        // If we using Xerial or Zentus impl.
        Class.forName("org.sqlite.JDBC");

        Connection con = DriverManager.getConnection("jdbc:sqlite:" + db_name);
        Statement statement = con.createStatement();
        ResultSet rs; 
        try {
            rs = statement.executeQuery("SELECT * FROM sites;");
            boolean flag = rs.isBeforeFirst(); // Breakpoint here
            System.out.println(flag);
            if (flag) rs.next();
            System.out.println(rs.getObject(1));
        } finally {
            statement.close();
            con.close();
        }
    } catch(Exception ex) {
        ex.printStackTrace();
    }
}

我试过JDK 1.6.0,1.6.0_23,JRE 1.6.0; JDBC-SQLite的3个实现:ch-werner SQLite Java Wrapper/JDBC Driver(r2011-01-06),Zentus SQLiteJDBC(0.5.6)和Xerial SQLite JDBC Driver(扩展Zentus,尝试3.6.20和3.7.2) )用于不同的SQLite测试数据库。

如果我在运行配置下运行它,它可以正常工作(打印true和所需的对象),但是当我尝试逐步调试(使用断点,然后是Step Over)时,它总是打印为false并且getObject由于不同的原因而失败(java.lang.ArrayIndexOutOfBoundsException: 2 >= 1在ch-werner impl下,java.lang.IllegalStateException: SQLite JDBC: inconsistent internal state在另外两个原因下。没有设置JVM参数,只是从头开始编写代码。我没能在NetBeans 6.9下重新解决这个错误。

我做错了什么或什么?

2 个答案:

答案 0 :(得分:2)

如果您使用调试配置会发生什么,但只需点击“go”(或Netbeans使用的任何内容)而不是逐个单步执行每一行?

我的猜测是你有一只手表正在评估一些带有副作用的方法(例如rs.next())并在你跨过线条时搞砸了应用程序的状态

答案 1 :(得分:0)

int getX(){
    y++;
    return x;
}

如果你在每个断点之后对getX()进行监视,调试器将调用getX()并且y将增加1.并且你的程序将具有与运行模式不同的行为。