ResultSet einer Datenbankabfrage - Nullpointer Exception

StefanG

Aktives Mitglied
Hallo,

mein Java Programm führt eine Access Datenbankabfrage durch und soll als Ergebnis einen Datensatz mit mehreren Inhalten zurück geben. Dabei ist es wichtig, das nicht alle Felder unbedingt gefüllt sind.
Alle Felder sind Text Felder.


Java:
stmt = con.createStatement();

				ResultSet rs = stmt.executeQuery(sQuery);

				while (rs.next()) {
					if (rs.wasNull()) {
					} else {
						sParamsTo = rs.getString("Mail_TO");
						sParamsCc = rs.getString("Mail_CC");
						sParamsBcc = rs.getString("Mail_BCC");
						sParamsBetreff = rs.getString("Betreff");
						sParamsZip = rs.getString("Zip");
						sParamsBic = rs.getString("BIC");
						sParamsText = rs.getString("Mailtext");
						sParamsVK = rs.getString("VK");
					}

				}
				rs.close();
				stmt.close();
				con.close();

Wie muss ich meine Variablen richtig füllen. In meiner Beispielabfrage ist so, dass die Variable "VK", wenn ich damit arbeiten möchte eine Null pointer Exception wirft, da die Abfrage keinen Wert in der Spalte "VK" zurück liefert.

Java:
// Falls VK vorhanden, DateiNamen anpassen
		if (!sParamsVK.isEmpty()) {
			sDateiName = sParamsVK + sDateiName;
		}

Was mache ich falsch?
 

ARadauer

Top Contributor
sParamsVK wird halt null sein... dann kannst du keine Methode drauf aufrufen...

if (sParamsVK != null) {
sDateiName = sParamsVK + sDateiName;
}
 

StefanG

Aktives Mitglied
Ist denn das befüllen der Variablen mit dem ResultSet richtig gelöst?

Die Variable sParamsVK = "" wird beim klassen Aufruf initialisiert. Aber durch das ResultSet überschrieben. Wie kann ich beim auslesen des ResultSet dafür sorgen, das nur etwas in die Variablen geschrieben wird, wenn auch ein Wert aus der Datenbank vorhanden ist?
 

Landei

Top Contributor
Wenn in der Datenbank [c]null[/c] steht, bekommst du auch [c]null[/c] zurück, egal was vorher in der Variablen stand. Du kannst das Problem gleich bei der Zuweisung erledingen (sofern "" ein passender Ersatzwert ist):
Java:
sParamsVK = rs.getString("VK") == null ? "" : rs.getString("VK");
 

StefanG

Aktives Mitglied
Wenn in der Datenbank [c]null[/c] steht, bekommst du auch [c]null[/c] zurück, egal was vorher in der Variablen stand. Du kannst das Problem gleich bei der Zuweisung erledingen (sofern "" ein passender Ersatzwert ist):
Java:
sParamsVK = rs.getString("VK") == null ? "" : rs.getString("VK");

Wenn ich ....

Java:
while (rs.next()) {
					if (rs.wasNull()) {
					} else {
						sParamsTo = rs.getString("Mail_TO") == null ? "" : rs
								.getString("Mail_TO");
						sParamsCc = rs.getString("Mail_CC") == null ? "" : rs
								.getString("Mail_CC");
						sParamsBcc = rs.getString("Mail_BCC") == null ? "" : rs
								.getString("Mail_BCC");
						sParamsBetreff = rs.getString("Betreff") == null ? ""
								: rs.getString("Betreff");
						sParamsZip = rs.getString("Zip") == null ? "" : rs
								.getString("Zip");
						sParamsBic = rs.getString("BIC") == null ? "" : rs
								.getString("BIC");
						sParamsText = rs.getString("Mailtext") == null ? ""
								: rs.getString("Mailtext");
						sParamsVK = rs.getString("VK") == null ? "" : rs
								.getString("VK");
					}

				}
				rs.close();
				stmt.close();
				con.close();

.. kommt folgende Exception:

java.sql.SQLException: No data found
at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcResultSet.getString(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcResultSet.getString(Unknown Source)

Benötige ich denn
Java:
if (rs.wasNull())
noch?
 
S

SlaterB

Gast
in der vorherigen Version kam der Fehler nicht, wurde dort das ResultSet auch zum Ende durchgelaufen?
ist der StackTrace nicht länger, welche deiner Codezeilen ist betroffen?

dass
> sParamsVK = rs.getString("VK") == null ? "" : rs.getString("VK");
kein so guter Rat war sieht man spätestens an deinem Code, diese Verdopplung jeder Abfrage sieht ja schrecklich aus,
wenn da in einer Zeile mal die beiden Strings für den SQL-Attribut-Namen per Tippfehler unterschiedlich sind..,
oder wenn diese Methode erst intern Daten aufwendig berechnet..

besser im Rahmen der Möglichkeiten ist eine statische Methode:
> sParamsVK = Xy.getNotNull(rs.getString("VK"));
lohnt sich quasi schon bei erster Verwendung, in so einer langen Auflistung oder verschiedenen Klassen umso mehr,

langfristig eine Alternative wäre eine eigene ResultSet-Klasse mit optionalen Methoden wie
> sParamsVK = rs.getStringNotNull("VK");
oder mit Defaultwert für Fall null:
> sParamsVK = rs.getString("VK", "");
 
Zuletzt bearbeitet von einem Moderator:

StefanG

Aktives Mitglied
in der vorherigen Version kam der Fehler nicht, wurde dort das ResultSet auch zum Ende durchgelaufen?
ist der StackTrace nicht länger, welche deiner Codezeilen ist betroffen?

sParamsTo = rs.getString("Mail_TO") == null ? "" : rs.getString("Mail_TO");

besser im Rahmen der Möglichkeiten ist eine statische Methode:
> sParamsVK = Xy.getNotNull(rs.getString("VK"));
lohnt sich quasi schon bei erster Verwendung, in so einer langen Auflistung oder verschiedenen Klassen umso mehr,

Warum in eine Methode auslagern und nicht direkt abfragen? Soll der Code kürzer gehalten werden?

Ist denn das auslesen des ResultSets richtig?

while (rs.next()) {
if (rs.wasNull()) {
} else {
//Variablen füllen
}

}

Wie würdet ihr denn das ResultSet auslesen?
 
Zuletzt bearbeitet:
S

SlaterB

Gast
die Funktion von wasNull() kannst du in der Bedienungsanleitung nachlesen,
ist hier unnötig bzw. evt. Grund für vorzeitigen Abbruch, findet sich in keinem Tutorial-Beispiel auf diese Weise

ich vermute dass der Fehler hier ist, dass der doppelte Aufruf eines Wertes nicht funktioniert, ein Grund mehr der dagegen spricht
I think the other poster is correct, that the 2nd call to getObject for the same column is the problem. Some drivers allow that and some don't (the JDBC allows this difference).
java.sql.SQLException: no data found (JDBC forum at JavaRanch)

---

wie die Methode getNotNull() aussieht kannst du dir nicht denken?
eine Methode die einen String als Parameter bekommt, diesen zurückgibt wenn nicht null oder ansonsten etwas anderes zurückgibt?
wäre schön wenn erst Grundlagen vorhanden wären bevor komplizierte DB-Anbindungen programmiert werden..
 

StefanG

Aktives Mitglied
Der Inhalt ist mir schon klar, jedoch sehe ich den Sinn noch nicht so ganz, warum diese Abfrage in eine seperate Methode soll.

Aber gut, scheinbar gibt es keinen anderen Weg. Werde das dann mal so umsetzen und berichten. DANKE!
 
S

SlaterB

Gast
die lokale Alternative wäre
Java:
String temp = rs.getString("Mail_TO");
sParamsTo = temp == null? "" : temp;
bzw.
Java:
sParamsTo = rs.getString("Mail_TO");
sParamsTo = sParamsTo == null? "" : sParamsTo;
oder jeweils mit if/else

Gründe für die Methode habe ich schon genannt (kürzer, weniger fehleranfällig), wenn nicht dann nicht
 

StefanG

Aktives Mitglied
sei doch nicht so mies drauf ;)

Danke für deine Tipps! Wollte es nur auch vernünftig verstehen, sonst bringt das ganze doch nichts.

Und nun werde ich :rtfm: ...
 

StefanG

Aktives Mitglied
Java:
while (rs.next()) {

					sParamsTo = checkQueryResult("Mail_TO");
					sParamsCc = checkQueryResult("Mail_CC");
					sParamsBcc = checkQueryResult("Mail_BCC");
					sParamsBetreff = checkQueryResult("Betreff");
					sParamsZip = checkQueryResult("Zip");
					sParamsBic = checkQueryResult("BIC");
					sParamsText = checkQueryResult("Mailtext");
					sParamsVK = checkQueryResult("VK");

				}

Java:
private String checkQueryResult(String sColTitle) {
		try {

			// Wenn Rückgabewert aus Datenbank null, dann "" einfügen
			sParamCheckResult = rs.getString(sColTitle);
			sParamCheckResult = sParamCheckResult == null ? ""
					: sParamCheckResult;

		} catch (SQLException e) {
			// Übergabe der Exception an LogFile
			addLogError("Methode checkQueryResult(): " + e.toString());
		}

		return this.sParamCheckResult;
	}
 
S

SlaterB

Gast
ha, solche Log-Meldungen (du könntest den Parameter im Fehlerfall ausgeben) und ähnliche mögliche Einbauten (zählen, Zeit messen, alles mögliche) sind ein Grund mehr für Methoden,
in allgemeiner Xy.getNotNull()-Methode nicht unbedingt passend, in speziellen Hilfstmethoden für Query schon eher,
gefällt mir ;)
 

StefanG

Aktives Mitglied
// Übergabe der Exception an LogFile
addLogError("Methode checkQueryResult(): " + e.toString()
+ " beim prüfen der Rückgabe von " + sColTitle);

Habe das auch mit Parameter gemacht, nur für das Forum gekürzt, weil nicht Thema ;-)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H ResultSet is closed tritt bei JSF aber nicht bei einer Java-Applikation auf Datenbankprogrammierung 10
F Oracle ResultSet zu einer HashMap<Integer, String[]> Datenbankprogrammierung 6
Z ResultSet mit einer anderen Datenquelle Datenbankprogrammierung 7
S ResultSet als Parameter an andere Klasse übergeben Datenbankprogrammierung 3
Z ResultSet ist null warum? Datenbankprogrammierung 12
R HSQLDB ResultSet update aktualisiert DB, aber nicht das ResultSet Datenbankprogrammierung 2
Dimax Erstellen ResultSet und Statement Datenbankprogrammierung 30
C PostgreSQL ResultSet.TYPE_SCROLL_SENSITIVE setzen Datenbankprogrammierung 2
L MySQL Bekomme einen Fehler beim ResultSet Datenbankprogrammierung 12
L Zugriff auf ein Resultset Datenbankprogrammierung 7
L MySQL ResultSet vollständig auslesen Datenbankprogrammierung 20
D Resultset schließen ?? Datenbankprogrammierung 5
T Oracle Resultset to Array sehr langsam. Datenbankprogrammierung 8
B Probleme mit java.sql.SQLException: ResultSet closed Datenbankprogrammierung 21
J SQLite ResultSet closed -- Wiederholende DB-Abfragen Datenbankprogrammierung 6
Z MySQL Probleme mit resultSet executQuery Datenbankprogrammierung 3
L ResultSet Datenbankprogrammierung 1
J wie mit resultset.next() über Datensätze iterieren? Datenbankprogrammierung 15
R MySQL Umgang mit ResultSet/Fremdschlüssel ausgeben Datenbankprogrammierung 2
D MySQL ResultSet als Stream weiter geben Datenbankprogrammierung 9
M ResultSet Cachen Datenbankprogrammierung 3
R ResultSet mit "Untertabellen" Datenbankprogrammierung 4
N SQL-Statement Auslesen des Resultset wird immer langsamer Datenbankprogrammierung 6
R Resultset.last() Problem Datenbankprogrammierung 12
PaulG Leeres ResultSet initialisieren Datenbankprogrammierung 6
J Frage zu ResultSet Datenbankprogrammierung 3
J SQL ResultSet Previous Datenbankprogrammierung 10
S MySQL ResultSet in ein Array übertragen Datenbankprogrammierung 7
H PostgreSQL Objekte aus ResultSet Datenbankprogrammierung 5
O Oracle Resultset greift auf Spaltenüberschriften zu Datenbankprogrammierung 2
Kenan89 Wieso klappt das ResultSet nicht? Datenbankprogrammierung 3
C ResultSet enthält nicht alle Daten Datenbankprogrammierung 4
F Derby/JavaDB Resultset in JTablemodel Datenbankprogrammierung 2
B SQLite ResultSet is TYPE_FORWARD_ONLY Datenbankprogrammierung 5
T Exception ResultSet Datenbankprogrammierung 7
0 ResultSet in JTable Datenbankprogrammierung 14
S [SQL] ResultSet Datenbankprogrammierung 4
R ResultSet Datenbankprogrammierung 4
I Sonderbehandlung wenn ResultSet leer ist Datenbankprogrammierung 9
I Problem mit ResultSet Datenbankprogrammierung 2
I SQL_Abfrage-Ergebnis (ResultSet) in String[] speichern Datenbankprogrammierung 29
B ResultSet wirft komische NullPointerException. Datenbankprogrammierung 3
R Detached ResultSet Datenbankprogrammierung 3
F generelle Vorgehensweise ResultSet Datenbankprogrammierung 5
S ResultSet Datenbankprogrammierung 2
A MySQL ResultSet.updateBytes schlägt fehl Datenbankprogrammierung 2
F ResultSet kann Datenbank nicht update, warum? Datenbankprogrammierung 3
T ResultSet befehl für leere Spalte nicht lesen Datenbankprogrammierung 4
A PostgreSQL anfängerfrage: resultset zeilenweise auslesen Datenbankprogrammierung 2
T MySQL ResultSet zurückgeben nachdem Connection geschlossen wurde? Datenbankprogrammierung 3
K Keine ResultSet bei if in StoredProcedure Datenbankprogrammierung 16
D ResultSet gibt nichts aus. Datenbankprogrammierung 3
trash ResultSet Syntax Fehler Datenbankprogrammierung 11
ARadauer JDBC ResultSet schließen? Datenbankprogrammierung 4
M Oracle Problem mit Resultset Datenbankprogrammierung 11
J jdbc ResultSet types Datenbankprogrammierung 5
R Frage zu PreparedStatement/ResultSet Datenbankprogrammierung 16
F ResultSet to String[] Datenbankprogrammierung 3
E ResultSet in HashMap Datenbankprogrammierung 8
K Tabelle mit resultset refreshen? Datenbankprogrammierung 4
M Problem mit ResultSet bei SQL Server 2005 Datenbankprogrammierung 6
S ResultSet in ArrayList ablegen Datenbankprogrammierung 17
G Daten aus ResultSet in String-Liste Datenbankprogrammierung 13
T ResultSet initialisieren Datenbankprogrammierung 2
C kein Resultset Datenbankprogrammierung 2
G ResultSet: String mit Anführungszeichen einlesen Datenbankprogrammierung 8
T ResultSet-Inhalt in Arrays schreiben Datenbankprogrammierung 3
S ResultSet variabel auslesen Datenbankprogrammierung 4
D Anzahl der Elemente im ResultSet ermitteln Datenbankprogrammierung 8
A Leeres ResultSet mit H2 unter Vista Datenbankprogrammierung 3
A Warum ist mein ResultSet leer? Datenbankprogrammierung 5
S ResultSet closed Datenbankprogrammierung 2
O Spaltenname aus Resultset Datenbankprogrammierung 2
thE_29 ResultSet und doppelte Spalten Datenbankprogrammierung 4
E Neues select auf ein vorhandenes Resultset Datenbankprogrammierung 11
E ResultSet vergisst Reihe? Datenbankprogrammierung 2
N resultset aus andere klasse übergeben Datenbankprogrammierung 3
F ResultSet refresh moeglich? Datenbankprogrammierung 3
S ResultSet enthält keine Daten Datenbankprogrammierung 2
B Geschlossenes ResultSet Datenbankprogrammierung 6
T ResultSet#next Ungültige Reihenfolge (DB2) Datenbankprogrammierung 5
T ResultSet schließen? Datenbankprogrammierung 6
S Tabelle updaten wenn ResultSet aus JDBC-Quelle Datenbankprogrammierung 2
S ResultSet Datenbankprogrammierung 6
F Filtern innerhalb eines Resultset Datenbankprogrammierung 12
S Connection/Statement/ResultSet auf einmal geschlossen Datenbankprogrammierung 8
@ Like-Klausel; NPE bzw. leeres ResultSet Datenbankprogrammierung 4
C Resultset nach connection close weiterreichen Datenbankprogrammierung 5
B No ResultSet was produced Datenbankprogrammierung 2
S ResultSet erweitern ? Datenbankprogrammierung 4
E JDBC, ForwardOnly bei ResultSet nach Uebergabe Datenbankprogrammierung 4
R ResultSet liefert oracle.sql.TIMESTAMP, aber unbrauchbar Datenbankprogrammierung 9
A Probleme mit ResultSet und getString(i) Datenbankprogrammierung 13
RaoulDuke ResultSet - Wie arbeitet sowas intern Datenbankprogrammierung 2
N Probleme mit "nur vorwärts gerichtete ResultSet" Datenbankprogrammierung 7
G Für jede SQL-Abfrage eigenes Statement und ResultSet? Datenbankprogrammierung 3
T MAX und ResultSet#next Datenbankprogrammierung 10
R ResultSet zu bestimmtem DS navigieren Datenbankprogrammierung 4
S .leeres Resultset abfangen Datenbankprogrammierung 2
B ResultSet ohne Datenbank erstellen Datenbankprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben