# Warum ist meine Connection null?



## richardkrieger (11. Okt 2006)

Hallo,

bin neu hier und das sind meine ersten "gehversuche" mit Java

Habe eine Klasse für Datenbankzugriffe geschrieben. Eine Methode dieser Klasse sollte die Verbindung liefern, liefert aber null:

```
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
import java.sql.Statement;
import java.sql.ResultSet;

public class DerbyDB {

	static final String Treiber = "org.apache.derby.jdbc.EmbeddedDriver";
	static final String protokol="jdbc:derby:";
	Properties userdaten=new Properties();
	SprachDatei sprache=new SprachDatei();
	
	public String getEinzel(String tabelle, String rgfeld, String suchfeld, String suchtext){
		String resultat="";
		String befehl="";
		try{
		Connection datenbank=verbinde();

		Statement bsatz=datenbank.createStatement();  // Hier meldet Compiler eine NullPointerException, da "datenbank" den Wert "null" hat

		befehl="SELECT "+rgfeld+" FROM "+tabelle+" WHERE "+suchfeld+"="+suchtext;
		ResultSet dbrg=bsatz.executeQuery(befehl);
		resultat=dbrg.getString(suchfeld);
		dbrg.close();
		bsatz.close();
		datenbank.commit();
		datenbank.close();
		} catch (SQLException sqlex){
			new FehlerFenster(sprache.uebersetze("SQLEXCEPTION"),sqlex.toString());
		}
		return resultat;
	}
	
	private Connection verbinde(){
		Connection verbindung=null;
		try{
			Class.forName(Treiber).newInstance();
			userdaten.put("user","benutzer");
			userdaten.put("password","kennwort");
			verbindung=DriverManager.getConnection(protokol+"FHNdata;create=true",userdaten);
			verbindung.setAutoCommit(false);
		} catch (SQLException sqlex){
			new FehlerFenster(sprache.uebersetze("SQLEXCEPTION"),sqlex.toString());
		}  catch (ClassNotFoundException knfex){
			new FehlerFenster(sprache.uebersetze("CLASS_NOT_FOUND_EXCEPTION"),knfex.toString());
		} catch (InstantiationException inex){
			new FehlerFenster(sprache.uebersetze("INSTANTIATION_EXCEPTION"),inex.toString());
		} catch(IllegalAccessException iaex){
			new FehlerFenster(sprache.uebersetze("ILLEGAL_ACCESS_EXCEPTION"),iaex.toString());
		}
		return verbindung;

	}
	
}
```

Debug (Eclipse) zeigt, dass "datenbank" den Wert "null" hat und ich bekomme logischerweise eine NullPointerException

Methode "verbinde" zeigt keine Fehler. Compiler zeigt den Fehler in "getEinzel". Habe ich was übersehen?


----------



## AlArenal (11. Okt 2006)

Jede Wette, dass du auf der Konsole noch nen Stacktrace hast.. Mach doch in #verbinde noch ein catch (Exception e) am Ende und schau ob da was landet (expect the unexpected).

BTW, wenn das wirklich dein erster Gehversuch in Java ist, gibst du dir zwar echt viel Mühe, machst es aber unnötig kompliziert. Brings doch erstnmal zum Laufen, ehe du dich an die Kosmetik machst und damit zusätzliche Fehlerquellen einbaust.


----------



## richardkrieger (11. Okt 2006)

habe ich gemacht:

```
} catch (Exception e){
			System.out.println(e.toString());
		}
```
da landet aber nach wie vor:


> Exception in thread "main" java.lang.NullPointerException
> at fhnclient.DerbyDB.getEinzel(DerbyDB.java:46)
> at fhnclient.HauptFenster.main(HauptFenster.java:19)



HauptFenster:19 - aufruf DerbyDB().getEinzel("tabelle","wertspalte","suchspalte","suchwert")
DerbyDB:46 - ist die Zeile, die ich oben im Listing beschrieben habe


----------



## hupfdule (11. Okt 2006)

In deiner verbinde() Methode _muss_ ein Fehler aufgetreten sein. Du gibst immer den Wert von 'datenbank' zurück. Dieser kann null sein, wenn etwas schief gelaufen ist. Der Fehler muss auch spätestens in Zeile 43 deines obigen Listings auftreten, da du sonst bereits in Zeile 44 die NPE bekommen würdest.

Könnte dein Fehlerfenster vlt. Mist bauen, dass du die Fehlermeldung einfach nicht siehst?

BTW: Du solltest in deinen catch-Blöcken trotzdem den Stacktrace mit ausgeben. Hilft dir bei der Fehlersuche stark weiter. Oder zumindest an dein Fehlerfenster weiter geben und dort anzeigen.


----------



## richardkrieger (11. Okt 2006)

Fehler habe ich gefunden, obwohl es meiner Meinung nach kein Fehler ist. Ich verstehe nicht warum, aber es funktioniert jetzt

Habe folgendes gemacht: anstatt

```
verbindung=DriverManager.getConnection(protokol+"FHNdata",userdaten);
```
Habe ich jetzt

```
verbindung=DriverManager.getConnection("jdbc:derby:FHNdata",userdaten);
```
... es ist merkwürdig.

was anderes: dbEdit sperrt anscheinend die Datenbank, und zwar so, dass auch ein Disconnect nicht hilft - ich muss Eclipse neu starten. Kann man es irgendwie korrigieren(Einstellungen oder so)? Ist zwar nicht schlimm aber etwas lästig 

Danke für die Hilfe !!!


----------



## hupfdule (12. Okt 2006)

Ähm, also den Unterschied zwischen

```
String protokoll="jdbc:derby:";
protokoll+"FHNdata";
```
und 

```
"jdbc:derby:FHNdata"
```
seh ich grad auch nicht. Bist du sicher, dass das zum Problem geführt hat? Das kann nicht wirklich sein.



> dbEdit sperrt anscheinend die Datenbank


Was ist dbEdit?


----------



## richardkrieger (12. Okt 2006)

... das meine ich auch. Ich sehe da keinen Unterschied, aber egal. Vor etwa 10 Jahren habe ich mich mit Turbo Pascal beschäftigt. Da gab es auch solche merkwürdigen Sachen. Seitdem code ich nach dem Prinzip: "richtig ist das, was funktioniert".

Es kann natürlich auch daran liegen, dass das meine ersten "gehversuche" sind und ich irgendwas nicht berücksichtigt habe, weil ich es einfach noch nicht weiss.

dbEdit ist Plugin für Eclipse(guck auf sourceforge.net) für Datenbankarbeit. Habe einen anderen Thread wegen Derby hier gestartet und ein Gast hat mit einem Link geantwortet, wo eine sehr gute Doku liegt. Anscheinend kann man auch ohne dbEdit mit Derby-eigenen Plugins für Eclipse arbeiten. Wie gesagt, bin ein Anfänger und weiss noch nicht unter welchen Menüpunkt was liegt 

Gruss Richard


----------

