2016-06-30 138 views
-4

請問在Java中,當我在IF語句中調用(resultSet != null && resultSet.next())語句並調試DISPLAY(在帶有斷點的情況下)後,看起來它不會輸入IF語句,雖然結果返回TRUE編譯器中的錯誤?

try { 
      conn = new BaseDA().getConnection(); 
      stmt = conn.prepareStatement(_sqlIns); 
      stmt.setInt(1, obj.getYrStart()); 
      stmt.setInt(2, obj.getAge()); 
      stmt.setDouble(3, obj.getBasicSaving()); 

      ResultSet resultSet = stmt.executeQuery(); 
       //can't get in after right-click DISPLAY 
      if (resultSet != null && resultSet.next()){ 
       result = resultSet.getString(_colnm1); 
      } 
     } 
+0

您的標題*編譯器中的錯誤*恕我直言,不是最好的...似乎更有可能您犯了一些錯誤,如....沒有結果'resultset'? –

+0

即使你的resultSet不爲null,resultSet.next()也會返回false。因爲那樣,如果block沒有執行。當你調試時,resultSet中的值是什麼? – sawyinwaimon

+0

添加一些控制檯並使用** getRow()**查看您查詢時有多少行可以恢復。 – AxelH

回答

1

首先,沒有編譯器的錯誤。爲什麼你會這麼認爲,如果調試器行爲奇怪?

二,stmt.executeQuery()不能返回null,所以刪除那個空的檢查。參見javadoc:

返回一個包含查詢產生的數據的對象ResultSet; 從未null

調用resultSet.next()移動 「光標」 到下一行。請參閱javadoc:

將光標從當前位置向前移動一行。 A光標最初位於第一行之前;對方法next的第一次調用使第一行成爲當前行;第二次調用使第二行成爲當前行,依此類推。

所以,如果你剛剛跨過在調試器中executeQuery()調用,resultSet位於第一行之前。

如果你再問問調試器(使用「顯示」),以評估表達,調試器實際上呼叫next()方法,它會推進到第一行,並返回true

當您隨後翻過if語句時,它將再次調用next()方法,該方法將嘗試前進到結果集的第二行。假設只返回了一行,它將返回false並跳過您的if塊。

因此,通過評估調試器中的表達式,導致跳過唯一的返回行。

總之:請注意在調試器中評估表達式的副作用。你不應該評估任何有副作用的東西。僅評估冪等方法,例如獲得者,toString()

+0

嗨,謝謝你的回答,你的失敗讓我從挫折中解脫出來。 ** next()**方法如果不完全理解,則非常危險。像我..哈哈謝謝你向我解釋。我認爲是調試器中的「顯示」中的一個錯誤。哈哈沒想到會引發** next()**方法^ _ ^和平出來。 – SicaYoumi

2

首先... 沒有在編譯器中的錯誤!

第二:你確定你會得到一些結果? 如果是繼續

解決方案:你不迭代根據resultSetOracle documentation建議,所以你會得到結果只有一個,而不是完整的結果集:

while (rs.next()) { 

} 

所以你必須:

ResultSet resultSet = stmt.executeQuery(); 
while (resultSet.next()) { 
    result = resultSet.getString(_colnm1); 
}