Zgodnie z JDBC tutorial:
resultSet = statement.executeQuery();
while (resultSet.next()) {
int id = resultSet.getInt("id");
// ...
}
W ResultSet#next()
przemieszcza się kursor jednym wierszu od aktualnej pozycji i zwraca true
jeśli nowa rząd prąd jest ważny. W związku z tym pętla while
zatrzyma się automatycznie, gdy nie będzie już żadnych wierszy.
Jeśli to ma powrócić zero lub jeden wiersz zamiast wielu wierszy, wtedy raczej używać if
zamiast:
resultSet = statement.executeQuery();
if (resultSet.next()) {
int id = resultSet.getInt("id");
// ...
}
ten sposób masz możliwość dodania się else
.
Aktualizacja, że powiedział i niezwiązane z rzeczywistym problemem, widzę więcej potencjalnych problemów w kodzie: po pierwsze, wydaje się ognia wielu zapytań, które są od siebie zależne. Można to zrobić bardziej wydajnie. Czy znasz SQL Joins? Po drugie, czy nie przeciekasz zasobów JDBC? Wygląda na to, że nabywasz oświadczenie, ale nie uzyskujesz go, aby można go było zamknąć po użyciu. Zapoznaj się z wcześniej połączonym samouczkiem JDBC, aby uzyskać podstawowe wyjaśnienie, jak poprawnie pracować z kodem JDBC i this article, aby zapoznać się z kilkoma podstawowymi przykładami kickoffów, jak poprawnie używać JDBC. W przeciwnym razie aplikacja może się wcześniej czy później zepsuć, gdy w bazie danych zabraknie zasobów.
Kiedy próbuję użyć rs.next() w instrukcji while, pojawia się ten sam błąd. – aphex
Możesz niemożliwie uzyskać 'Nielegalne działanie na pustym zestawie wyników' podczas wywoływania' next() 'na świeżo uzyskanym zestawie wyników. Więc twój problem leży gdzie indziej. Albo uzyskujesz dostęp do niewłaściwego zestawu wyników lub źle interpretujesz wyjątek i/lub linię kodu, w której zostały spowodowane. – BalusC
Jeśli 'getSt' (sugeruję użycie pełnych słów) zwraca to samo' Statement', to nie jest przeciek. Moje JDBC jest bardzo zardzewiałe, czy wolno ci dalej używać iteratora podczas wykonywania innego stwierdzenia na 'Statement' (zła analogia: mutowanie kolekcji podczas iteracji nad nią)? W każdym razie użyj raczej 'PreparedStatement' niż dynamicznego SQL. Edycja: Drugi wiersz dokumentów API "Statement": "Domyślnie tylko jeden obiekt ResultSet na obiekt Statement może być otwarty w tym samym czasie." –