2011-01-21 132 views
0

/*问题回答*/不同的结果

嗨,我使用Eclipse 3.6.1(太阳神),我通过JDBC接口SQLite数据库工作。问题是我在调试和运行模式下得到了不同的结果。这里是测试用例:

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;对于不同的SQLite测试数据库,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)。

如果我运行此之下运行配置,它工作正常(打印true和所需的对象),但是当我尝试一步一步的调试(使用断点,然后步过的),它总是打印错误和getObject失败出于不同的原因(在ch-werner impl下的java.lang.ArrayIndexOutOfBoundsException: 2 >= 1和在另外两个下的java.lang.IllegalStateException: SQLite JDBC: inconsistent internal state)。没有设置JVM参数,只是从头开始编写代码。我无法在NetBeans 6.9下重新修复此错误。

我做错了什么或者是什么?

回答

2

如果使用调试配置会发生什么情况,但只需点击“去”(或任何Netbeans使用)而不是逐一逐行扫描每一行?

猜测是,你有一只手表,是评估一些方法有副作用(例如rs.next())和搞砸了应用程序的状态,当你跨过线。

+0

你的猜测是完全正确的,我很抱歉成为这样一个愚蠢的:)我会尽快接受你的答案,因为我会被允许的。 – 2011-01-21 07:46:37

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

如果你以后每隔穿上了getX()监视断点调试器将调用的getX()和y将通过1递增,您PROGRAMM必须从运行模式不同的行为。