2011-01-21 127 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必須從運行模式不同的行爲。