# ResultSet einer Datenbankabfrage - Nullpointer Exception



## StefanG (27. Jan 2011)

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.



```
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.


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

Was mache ich falsch?


----------



## ARadauer (27. Jan 2011)

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

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


----------



## StefanG (27. Jan 2011)

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 (27. Jan 2011)

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):

```
sParamsVK = rs.getString("VK") == null ? "" : rs.getString("VK");
```


----------



## StefanG (27. Jan 2011)

Landei hat gesagt.:


> 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):
> 
> ```
> sParamsVK = rs.getString("VK") == null ? "" : rs.getString("VK");
> ```



Wenn ich ....


```
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 
	
	
	
	





```
if (rs.wasNull())
```
  noch?


----------



## SlaterB (27. Jan 2011)

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", "");


----------



## StefanG (27. Jan 2011)

SlaterB hat gesagt.:


> 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"); 



SlaterB hat gesagt.:


> 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?


----------



## SlaterB (27. Jan 2011)

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 (27. Jan 2011)

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!


----------



## SlaterB (27. Jan 2011)

die lokale Alternative wäre

```
String temp = rs.getString("Mail_TO");
sParamsTo = temp == null? "" : temp;
```
bzw.

```
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 (27. Jan 2011)

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 (27. Jan 2011)

```
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");

				}
```


```
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;
	}
```


----------



## SlaterB (27. Jan 2011)

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 (27. Jan 2011)

// Ü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 ;-)


----------

