2016-06-30 4 views
-4

Могу ли я спросить, что в Java, после того, как я выделить (resultSet != null && resultSet.next()) в IF заявлении и 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

Ваше название * ошибка в компиляторе * IMHO не лучший ... кажется вероятнее, что вы допустили некоторую ошибку, например .... нет результатов в 'resultset'? –

+0

, хотя ваш resultSet не равен null, resultSet.next() вернет false. Из-за этого, если блок не выполнен. Когда вы делаете отладку, какое значение в resultSet? – sawyinwaimon

+0

Добавьте консоль и используйте ** getRow() **, чтобы узнать, сколько строк вы восстановили с запросом. – AxelH

ответ

1

Во-первых, нет компилятор ошибка. Почему вы так считаете, если детектор действует странно?

Во-вторых, stmt.executeQuery() не может вернуть null, поэтому удалите эту нуль проверку. См. Javadoc:

Возвращает объект ResultSet, содержащий данные, полученные по запросу; никогда null

resultSet.next() Вызов переместить "курсор" на следующую строку. См. Javadoc:

Перемещает курсор вперед на одну строку от текущей позиции. A ResultSet курсор изначально расположен перед первой строкой; первый вызов метода next делает первую строку текущей строкой; второй вызов делает вторую строку текущей строкой и так далее.

Так что, если вы только перешагнул executeQuery() вызова в отладчике, то resultSet позиционируется перед первой строкой.

Если вы попросите отладчик оценить выражение (с помощью «Display»), отладчик будет на самом деле вызоваnext() метод, который будет перейти к первой строке и вернуть true.

Если вы затем перейдете к оператору if, он снова вызовет метод next(), который попытается перейти ко второй строке результирующего набора. Предполагая, что была возвращена только одна строка, она вернет false и ваш блок if будет пропущен.

Итак, оценив выражение в отладчике, вы вызвали пропущенную только что возвращаемую строку.

Вкратце: Остерегайтесь побочных эффектов оценки выражений в отладчике. Вы не должны оценивать что-либо, что имеет побочные эффекты. Оценивать только идемпотентные методы, например. getters, toString().

+0

Привет, спасибо за ответ, ваш asnwer избавит меня от моего разочарования. Метод ** next() ** очень опасен, если не понимать полностью. как я .. .. спасибо, что объяснил мне. Я думал, что это ошибка в «Дисплей» в отладчике. ха-ха не ожидал, что это вызовет ** next() ** method^_^peace out. – SicaYoumi

2

Прежде всего ... НЕТ НЕТ НЕТ ОШИБКИ В компиляторе !!!

Второе: вы уверены, что получили некоторые результаты? Если да продолжить

Решение: вы не Итерируя resultSet по Oracle documentation предлагает, так что вы получите только один результат вместо полного набора результатов:

while (rs.next()) { 

} 

Таким образом, вы должны:

ResultSet resultSet = stmt.executeQuery(); 
while (resultSet.next()) { 
    result = resultSet.getString(_colnm1); 
} 
Смежные вопросы