# Daten aus ResultSet in String-Liste



## Guest (9. Feb 2009)

Hallo.

Vorweg muss ich gestehen, dass ich sonst immer nur mitgelesen habe was hier so Abging und mir das schon immer sehr geholfen hat. Jetzt komme ich aber in der Tat nicht weiter und ich musste mich mal registrieren um diese Frage hier zu stellen.

Ich habe ein Problem, dass ich immer eine Null-Pointer-Exception bekomme wenn ich Daten aus einem SQL-Query gespeichert in einem ResultSet in eine StringListe eintragen will.

Folgendes:

Ich habe zwei PreparedStatement: 

stmtAuthor = conn.prepareStatement("insert into researcher (name) values (?);");
stmtSelectAuthor = conn.prepareStatement("select * from researcher where name = (?) group by name");

Das erste fügt einen Eintrag hinzu und das zweite prüft, ob ein String schon enthalten ist.

Jetzt das eigentliche Problem - hier der Code:


```
try {
			//Pruefen ob schon in der Datenbank vorhanden
			stmtSelectAuthor.setString(1, toAdd);
			rsTest = stmtSelectAuthor.executeQuery();
			if (rsTest.next()) {
				//falls ja dann nur den namen fuer das erstellen der Relationen in der Liste speichern
				rsTest.next();
				authors_id[au_i] = rsTest.getString(1);
				au_i++;
			}
			else {
				//falls nein dann die Daten in die Datenbank schreiben
				rsTest.next();
				stmtAuthor.setString(1, toAdd);
				stmtAuthor.executeUpdate();
				//und wieder auslesen um die ID zu bekommen 
				stmtSelectAuthor.setString(1, toAdd);
				rsAuthor = stmtSelectAuthor.executeQuery();
				rsAuthor.next();
				//diese ID dann in die Liste speichern fuer die Erstellung der Relationen
				authors_id[au_i] = rsAuthor.getString(1);
				au_i++;
			}
```

Dort passiert folgendes: (sollte zumindest)

Prüfen ob das Statement was zurückliefert. Falls ja ist der Author schon in der Datenbank und ich will den Namen nur in einer String-Liste abspeichern, damit ich später drauf zurückgreifen kann, da ein Buch mehrere Autoren haben kann.

Falls der Author noch nicht drin ist wird dieser hinzugefügt und anschließend nochmal geprüft ob dieser nun auch drin ist und in das ResultSet geschrieben. (Ich brauche die ID von dem Eintrag) Anschließend will ich den Wert dann auch in die Liste schreiben und da ist der Fehler.

Ich bekomme immer eine NullPointerException am Punkt: authors_id[au_i] = rsAuthor.getString(1);

Ich weiß leider keinen Rat mehr. Ich bitte um Eure Hilfe.

Danke schon einmal


----------



## Guest (9. Feb 2009)

Warum rufts du das next() immer doppelt auf?


```
if (rsTest.next()) {
            //falls ja dann nur den namen fuer das erstellen der Relationen in der Liste speichern
            rsTest.next();
            
            .......
         }
         else {
            //falls nein dann die Daten in die Datenbank schreiben
            rsTest.next();
           .........
         }
```

Zum Verständnis, next() liefert einerseits true oder false zurück und setzt den DB-Cursor im Erfolgsfall auch gleich auf die nächste Zeile. 

Im if-Fall führt das zweite next dazu, das eine Zeile übersprungen wird, im else-Fall macht es überhaupt keinen Sinn, da ja bereits if(reTest.next()) false war.


----------



## SlaterB (9. Feb 2009)

das ResultSet kann nicht null sein, dann gäbe es schon vorher eine Exception,
kann nur authors_id null sein


----------



## Guest (9. Feb 2009)

Ok erscheint logisch - ich habe jetzt mal die beiden sinnfreien weiterschaltungen auskommentiert.

Trotzdem immernoch der Fehler: 


```
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at addToDB.AddToDB.addThis(AddToDB.java:111)
```

Der Code nun:


```
try {
			//Pruefen ob schon in der Datenbank vorhanden
			stmtSelectAuthor.setString(1, toAdd);
			rsTest = stmtSelectAuthor.executeQuery();
			if (rsTest.next()) {
				//falls ja dann nur den namen fuer das erstellen der Relationen in der Liste speichern
				//rsTest.next();
				authors_id[au_i] = rsTest.getString(1); // <--- HIER IST ZEILE 111
				au_i++;
			}
			else {
				//falls nein dann die Daten in die Datenbank schreiben
				//rsTest.next();
				stmtAuthor.setString(1, toAdd);
				stmtAuthor.executeUpdate();
				//und wieder auslesen um die ID zu bekommen 
				stmtSelectAuthor.setString(1, toAdd);
				rsAuthor = stmtSelectAuthor.executeQuery();
				//rsAuthor.next();
				//diese ID dann in die Liste speichern fuer die Erstellung der Relationen
				authors_id[au_i] = rsAuthor.getString(1);
				au_i++;
			}
```

Also ist der Fehler immernoch da wo er versucht, den String in die Liste zu schreiben.

Denke mal beim Else-Fall wäre der selbe Fehler, aber soweit wird der wohl gerade nicht gekommen sein.

Dass die ID von einem Author null sein könnte geht nicht, da die Tabelle Researcher nur 2 Spalten hat: ID und Author wobei ID ein autoincrement ist und daher nicht null sein kann wenn der Author drin steht.

Danke auf jeden fall schonmal für die ersten Hilfen! 

Grüße


----------



## SlaterB (9. Feb 2009)

SlaterB hat gesagt.:
			
		

> das ResultSet kann nicht null sein, dann gäbe es schon vorher eine Exception,
> kann nur authors_id null sein


----------



## narfist (9. Feb 2009)

SlaterB hat gesagt.:
			
		

> SlaterB hat gesagt.:
> 
> 
> 
> ...



Ja das hab ich schon gelesen, aber ich habe alles als öffentliche Klassenvariable initialisiert:

	public static ResultSet rsAuthor;
	public String authors_id[];

Und wenn der in den IF-Fall geht steht im ResultSet ja etwas, was heißt, dass schon einmal der Author drin steht und auch eine ID hat. Also müsste im ResultSet etwas der Art stehen: [ID,Author] und das kann ich ja nur mit .getString(1); abgreifen und die ID liefern. Diese wiederum wird ja als String behandelt und sollte eigentlich ohne problem in die Liste geschrieben werden können.

Ich weiß von deinem Tipp her leider nicht wo der Denkfehler ist.

(Zum Verständnis: Ich brauche die IDs um damit die Relationen zwischen den Tabellen aufbauen zu können.)

Grüße

[EDIT]Ich bin der Gast von oben - jetzt doch mal tatsächlich eingeloggt[/EDIT]


----------



## SlaterB (9. Feb 2009)

das String[] authors_id ist null, und jeder Zugriff darauf führt zu einer NullPointerException,

ich weiß nicht wieso du über das ResultSet redest und was ich da noch mehr sagen könnte


----------



## narfist (9. Feb 2009)

Ja wie soll ich denn sonst die Werte aus dem ResultSet in die String-Liste bekommen?

Ich dachte, dass es über eine solche Zuweisung geht. Es wird ja jeweils ein neues Feld der Liste mit au_i (Zähler für die Liste).

Ein anderes hinzufügen habe ich leider nicht gefunden. Wie sollte ich denn das sonst machen?

Grüße


----------



## SlaterB (9. Feb 2009)

authors_id = new String[599];


----------



## mvitz (9. Feb 2009)

java.util.List benutzen oder vorher das Array initialisieren.


----------



## narfist (9. Feb 2009)

Ok ist vieleicht nicht das eleganteste aber das tut es auch. Danke dafür.

Nächste Frage follgt gleich:

SQLException at Author: Before start of result set

jetzt meckert der aber tatsächlich mit dem ResultSet rum.


```
try {
			//Pruefen ob schon in der Datenbank vorhanden
			stmtSelectAuthor.setString(1, toAdd);
			rsTest = stmtSelectAuthor.executeQuery();
			if (rsTest.next()) {
				//falls ja dann nur den namen fuer das erstellen der Relationen in der Liste speichern
				authors_id[au_i] = rsTest.getString(1);
				au_i++;
			}
			else {
				//falls nein dann die Daten in die Datenbank schreiben
				//rsTest.next();
				stmtAuthor.setString(1, toAdd);
				stmtAuthor.executeUpdate();
				//und wieder auslesen um die ID zu bekommen 
				stmtSelectAuthor.setString(1, toAdd);
				rsAuthor = stmtSelectAuthor.executeQuery();
				//diese ID dann in die Liste speichern fuer die Erstellung der Relationen
				authors_id[au_i] = rsAuthor.getString(1);
				au_i++;
			}
		} catch (SQLException e) {
			System.out.println("SQLException at Author: " + e.getMessage());
		}
```

Das ist immernoch der Code 

Ich versteh allerdings nicht ganz was mir dieser Fehler sagen will


----------



## SlaterB (9. Feb 2009)

Zeilennummer weglassen wird auch nicht besser, wenn es ein Anschlussfrage ist 

wahrscheinlich meinst du Zeile 19,
und dort gilt nunmal immer noch die Regel: bevor man etwas aus einem ResultSet lesen kann, muss man per next() den ersten Eintrag aktivieren,
noch fehlt der next() Aufruf


----------



## narfist (9. Feb 2009)

Ok vielen Dank für die Hilfe - Ich habe jetzt die Fehler gefunden und behoben und es funktioniert.

Für Leute die das noch einmal lesen:

Meine Fehler waren das nicht initialisieren der String-Liste: 	public String[] authors_id = new String[70];
und das ich vergessen hatte das ResultSet mit .next() weiterzuschalten.

Der Code sieht nun also wie folgt aus:


```
public String[] authors_id = new String[70];
......
			stmtAuthor = conn.prepareStatement("insert into researcher (name) values (?);");
			stmtSelectAuthor = conn.prepareStatement("select * from researcher where name = (?) group by name");
......
		try {
			//Pruefen ob schon in der Datenbank vorhanden
			stmtSelectAuthor.setString(1, toAdd);
			rsTest = stmtSelectAuthor.executeQuery();
			if (rsTest.next()) {
				//falls ja dann nur den namen fuer das erstellen der Relationen in der Liste speichern
				authors_id[au_i] = rsTest.getString(1);
				au_i++;
			}
			else {
				//falls nein dann die Daten in die Datenbank schreiben
				stmtAuthor.setString(1, toAdd);
				stmtAuthor.executeUpdate();
				//und wieder auslesen um die ID zu bekommen 
				stmtSelectAuthor.setString(1, toAdd);
				rsAuthor = stmtSelectAuthor.executeQuery();
				rsAuthor.next();
				//diese ID dann in die Liste speichern fuer die Erstellung der Relationen
				authors_id[au_i] = rsAuthor.getString(1);
				au_i++;
			}
		} catch (SQLException e) {
			System.out.println("SQLException at Author: " + e.getMessage());
		}
......
```

Vielen Dank nochmals an alle die geholfen haben.

Grüße


----------



## dominikD (10. Feb 2009)

Bist du darauf angewiesen ein String-Array zu verwenden?

An deiner stelle würde ich eine ArrayList oder ähnliches verwenden. Damit wärst du um einiges flexibler, es könnte die bei deiner jetzigen Lösung irgendwann einmal passieren, dass du einen Eintrag aus dem ResultSet an eine stelle im String-Array  schreiben willst die nicht vorhanden ist.


----------

