# Fehler in der Datenbankklasse



## alaska94 (22. Mai 2006)

Hallo Leute,

ich wollte mir eine Datenbankklasse bauen.
Mein Konzept ist wie folgt.
Ich habe ein Klasse Connect die die ganze Verbindungen aufbaut.
Dann habe ich eien Klasse Datenabnk die für Abfragen etc zuständig ist.
Dann habe ich eine Kasse Module, wo ich alle Abgragen für mein Gästebuch brauche.
Und dann noch eine Mai, wo ich das Programm mit starte.
Wenn ich es starte erscheint folgende Meldung.

Exception in thread "main" java.lang.NullPointerException
	at Gaestebuch.Datenbank.hole_query(Datenbank.java:32)
	at Gaestebuch.LeseModule.get_Beitraege(LeseModule.java:17)
	at Gaestebuch.Haupt.main(Haupt.java:13)

Hier mein Quellcode:

```
package Gaestebuch;

public class Connect {
	private String treiber;

	private String verbindung;

	private String host;

	private String user;

	private String password;

	private String datenbankname;

	// Diese Methode setzt die Treiber
	public void setze_treiber(String wert) {
		if (wert == "sql") {
			this.treiber = "com.mysql.jdbc.Driver";
		}
	}

	// Diese Methode sendet die Treiberdaten
	public String nehme_treiber() {
		return (this.treiber);
	}

	public void setze_verbindung(String wert) {
		if (wert == "sql") {
			this.verbindung = "jdbc:mysql://" +  this.host+ "/" + this.datenbankname;
		}
	}

	public String nehme_verbindung() {
		return this.verbindung;
	}

	public String getHost() {
		return host;
	}

	public void setHost(String host) {
		this.host = host;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getUser() {
		return user;
	}

	public void setUser(String user) {
		this.user = user;
	}

	public String getDatenbankname() {
		return datenbankname;
	}

	public void setDatenbankname(String datenbankname) {
		this.datenbankname = datenbankname;
	}

}
```


```
package Gaestebuch;

import java.sql.*;
import java.util.HashMap;
import java.util.Vector;

public class Datenbank extends Connect {
	
	private Connection con;
	private Statement state;
	private ResultSet result;
	
	//Diese Methode baut eine Verbindung zur Datenbank auf
	protected void verbindung(){
		try {
			Class.forName(this.nehme_treiber());
		} catch (ClassNotFoundException e) {
			// TODO Automatisch erstellter Catch-Block
			e.printStackTrace();
		}
		try {
			con=DriverManager.getConnection(this.nehme_verbindung(),this.getUser(),this.getPassword());
		} catch (SQLException e) {
			// TODO Automatisch erstellter Catch-Block
			e.printStackTrace();
		}
	}
	
	//Diese Methode wird fÃ¼r Select Statements verwendet
	protected void hole_query(String abfrage){
		try {
			this.result=state.executeQuery(abfrage);
		} catch (SQLException e) {
			// TODO Automatisch erstellter Catch-Block
			e.printStackTrace();
		}
		
	}
	
	//Diese Methode wird fÃ¼r Insert und Update Statements verwendet
	protected void schreibe_query(String abfrage){
		
		try {
			state.executeUpdate(abfrage);
		} catch (SQLException e) {
			// TODO Automatisch erstellter Catch-Block
			e.printStackTrace();
		}
	}
	
	//Diese Methode schlieÃŸt die Verbindung zur Datenbank
	protected void schliesseVerbindung(){
		try {
			state.close();
		} catch (SQLException e) {
			// TODO Automatisch erstellter Catch-Block
			e.printStackTrace();
		}
		try {
			con.close();
		} catch (SQLException e) {
			// TODO Automatisch erstellter Catch-Block
			e.printStackTrace();
		}
		
	}
	
	//Diese Methode wird verwendet, wenn 1 oder mehr DatensÃ¤tze aus der Tabelle geholt wird
	protected Vector fetchAsVector() {
		Vector results = new Vector();
		try {
			ResultSetMetaData metaData = result.getMetaData();
			int anzSpalten = metaData.getColumnCount();
			while (result.next()) {
				HashMap row = new HashMap();
				for (int i = 1; i != anzSpalten + 1; i++) {
					Object obj = result.getObject(i);
					String name = metaData.getColumnName(i);
					name = name.toUpperCase();
					row.put(name, obj);
				}
				results.add(row);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return results;

	}
	
	//Diese Methode wird verwendet, wenn ein Datenasatz aus der Tabelle geholt wird
	protected HashMap fetchasHash(){
		HashMap resultat=new HashMap();
		ResultSetMetaData metaData;
		try {
			metaData = result.getMetaData();
			int anzSpalten = metaData.getColumnCount();
			result.first();
			for (int i = 1; i != anzSpalten + 1; i++) {
				Object obj = result.getObject(i);
				String name = metaData.getColumnName(i);
				name = name.toUpperCase();
				resultat.put(name, obj);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return resultat;
	}
	
}
```


```
package Gaestebuch;

import java.util.Vector;
public class LeseModule extends Datenbank{
		
	public void verbindungsaufbau(){
		this.setHost("localhost");
		this.setUser("root");
		this.setPassword("12345");
		this.setDatenbankname("java");
		this.setze_verbindung("sql");
		this.setze_treiber("sql");
	}
	
	public void get_Beitraege(){
		String abfrage="Select * from test";
		this.hole_query(abfrage);
		Vector vec=this.fetchAsVector();
		for(int i=0;i<vec.size();i++){
			System.out.println(vec.elementAt(1)+"\t");
		}
	}
		
}
```


```
package Gaestebuch;


public class Haupt {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Automatisch erstellter Methoden-Stub
		LeseModule lesen=new LeseModule();
		lesen.verbindungsaufbau();
		lesen.get_Beitraege();
	}

}
```
 Was ist falsch??

Gruß

alaska[/quote]


----------



## alaska94 (23. Mai 2006)

Hallo, hat keiner einen Lösungsansatz? Oder weiß einer, wo das Problem liegt?`?

Gruß

Markus


----------



## SamHotte (23. Mai 2006)

So wie's aussieht, ist dein Feld "state" gleich null.


----------



## alaska94 (23. Mai 2006)

Mhm ok, also die SQL Abfrage habe ich jetzt überprüft die stimmt.
Habe ich denn ein Logicfehler oder etwas ähnliches drin??


Gruß


----------



## SamHotte (23. Mai 2006)

Logikfehler nicht unbedingt. Aber wenn der Verbindugsaufbau scheitert, arbeitet das Programm trotzdem weiter, da die Exceptions nicht weiter beachtet werden. Und dann sind eben manche Objekte gleich null, statt vernünftig initialisiert zu sein.


----------



## SamHotte (23. Mai 2006)

Lösungsansatz: alle Methoden der Klasse Datenbank könnten einen booleschen Wert zurückgeben - true, wenn erfolgreich, false, wenn die Exception auftrat.

Diese Wert fragt man dann ab, eh man den nächsten Schritt tut.


----------



## alaska94 (23. Mai 2006)

Mhm also ich habe deinen Rat befolgt.
Ich habe das Gefühl, das das Programm gar nicht erst ausgeführt wird.
Er gibt mir auch keien Kontrollausgaben aus wenn ich irgentwo println schreibe.
Muss irgentwo anders ran liegen.

Gruß


Markus


----------



## KSG9|sebastian (23. Mai 2006)

```
public void setze_verbindung(String wert) { 
      if (wert == "sql") { 
         this.verbindung = "jdbc:mysql://" +  this.host+ "/" + this.datenbankname; 
      } 
   }
```

Strings vergleicht man mit equals ("sql".equals(wert)). Dadurch wirft er mit Sicherheit eine Exception beim erzeugen der Verbindung. Und dadurch wird dein Statement (state) nicht initialisiert sondern bleibt null.


----------



## KSG9|sebastian (23. Mai 2006)

Oh, auserdem wird nie eine Verbindung erzeugt.Irgendwo muss noch die Methode Datenbank#verbindung aufgerufen werden.
Dann noch die Methode so ändern.

```
protected void verbindung(){ 
      try { 
         Class.forName(this.nehme_treiber()); 
      } catch (ClassNotFoundException e) { 
         // TODO Automatisch erstellter Catch-Block 
         e.printStackTrace(); 
      } 
      try { 
         con=DriverManager.getConnection(this.nehme_verbindung(),this.getUser(),this.getPassword()); 
         state = con.createStatement();
      } catch (SQLException e) { 
         // TODO Automatisch erstellter Catch-Block 
         e.printStackTrace(); 
      } 
   }
```


----------



## KSG9|sebastian (23. Mai 2006)

Die Methode verbindungsaufbau ändern:


```
public void verbindungsaufbau(){ 
      this.setHost("localhost"); 
      this.setUser("root"); 
      this.setPassword("12345"); 
      this.setDatenbankname("java"); 
      this.setze_verbindung("sql"); 
      this.setze_treiber("sql"); 
      this.verbindung();
   }
```


----------



## SamHotte (23. Mai 2006)

Debuggen könnte helfen - Breakpoint in main() auf der ersten Anweisung, dann durchlaufen und sehen, was gemacht wird.


----------



## alaska94 (23. Mai 2006)

Ich habe die Änderungen durchgeführt, leider noch immer ohne Erfolg


----------



## SamHotte (23. Mai 2006)

oh, meine Glaskugel ... ;-)

wie genau versuchst du es mittlerweile? (--> code)


----------



## alaska94 (23. Mai 2006)

Ich habe alles Versucht was ihr bis jetzt geschrieben hat.
Hier nochmal der Aktuelle Sourecode.

Die Datenbankklasse

```
import java.sql.*;
import java.util.HashMap;
import java.util.Vector;

public class Datenbank extends Connect {
	
	private Connection con;
	private Statement state;
	private ResultSet result;
	
	//Diese Methode baut eine Verbindung zur Datenbank auf
	protected void verbindung(){
	      try {
	         Class.forName(this.nehme_treiber());
	      } catch (ClassNotFoundException e) {
	         // TODO Automatisch erstellter Catch-Block
	         e.printStackTrace();
	      }
	      try {
	         con=DriverManager.getConnection(this.nehme_verbindung(),this.getUser(),this.getPassword());
	         state = con.createStatement();
	      } catch (SQLException e) {
	         // TODO Automatisch erstellter Catch-Block
	         e.printStackTrace();
	      }
	   }

	
	//Diese Methode wird für Select Statements verwendet
	protected void hole_query(String abfrage){
		try {
			Statement stmt = con.createStatement();
			this.result=stmt.executeQuery(abfrage);
		} catch (SQLException e) {
			// TODO Automatisch erstellter Catch-Block
			//e.printStackTrace();
			System.out.println("Hier ist ein Lesefehler");
			
		}
		
	}
	
	//Diese Methode wird für Insert und Update Statements verwendet
	protected void schreibe_query(String abfrage){
		
		try {
			Statement stmt = con.createStatement();
			stmt.executeUpdate(abfrage);
		} catch (SQLException e) {
			// TODO Automatisch erstellter Catch-Block
			//e.printStackTrace();
			System.out.println("Hier ist ein Fehler");
			}
	}
	
	//Diese Methode schließt die Verbindung zur Datenbank
	protected void schliesseVerbindung(){
		try {
			this.state.close();
		} catch (SQLException e) {
			// TODO Automatisch erstellter Catch-Block
			//e.printStackTrace();
			System.out.println("Hier ist ein schließfehler");
			
		}
		try {
			this.con.close();
		} catch (SQLException e) {
			// TODO Automatisch erstellter Catch-Block
			e.printStackTrace();
		}
		
	}
	
	//Diese Methode wird verwendet, wenn 1 oder mehr Datensätze aus der Tabelle geholt wird
	protected Vector fetchAsVector() {
		Vector results = new Vector();
		try {
			ResultSetMetaData metaData = this.result.getMetaData();
			int anzSpalten = metaData.getColumnCount();
			while (this.result.next()) {
				HashMap row = new HashMap();
				for (int i = 1; i != anzSpalten + 1; i++) {
					Object obj = this.result.getObject(i);
					String name = metaData.getColumnName(i);
					name = name.toUpperCase();
					row.put(name, obj);
				}
				results.add(row);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return results;

	}
	
	//Diese Methode wird verwendet, wenn ein Datenasatz aus der Tabelle geholt wird
	protected HashMap fetchasHash(){
		HashMap resultat=new HashMap();
		ResultSetMetaData metaData;
		try {
			metaData = this.result.getMetaData();
			int anzSpalten = metaData.getColumnCount();
			this.result.first();
			for (int i = 1; i != anzSpalten + 1; i++) {
				Object obj = this.result.getObject(i);
				String name = metaData.getColumnName(i);
				name = name.toUpperCase();
				resultat.put(name, obj);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return resultat;
	}
	
}
```
KLasse Connect

```
public class Connect {
	private String treiber;

	private String verbindung;

	private String host;

	private String user;

	private String password;

	private String datenbankname;

	// Diese Methode setzt die Treiber
	public void setze_treiber(String wert) {
		if (wert == "sql") {
			this.treiber = "com.mysql.jdbc.Driver";
		}
	}

	// Diese Methode sendet die Treiberdaten
	public String nehme_treiber() {
		return (this.treiber);
	}

	public void setze_verbindung(String wert) {
		if (wert == "sql") {
			this.verbindung = "jdbc:mysql://" +  this.host+ "/" + this.datenbankname;
		}
	}

	public String nehme_verbindung() {
		return this.verbindung;
	}

	public String getHost() {
		return this.host;
	}

	public void setHost(String host) {
		this.host = host;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getUser() {
		return this.user;
	}

	public void setUser(String user) {
		this.user = user;
	}

	public String getDatenbankname() {
		return this.datenbankname;
	}

	public void setDatenbankname(String datenbankname) {
		this.datenbankname = datenbankname;
	}

}
```
Das Modul

```
import java.util.Vector;
public class LeseModule extends Datenbank{
		
	public void verbindungsaufbau(){
	      this.setHost("localhost");
	      this.setUser("root");
	      this.setPassword("12345");
	      this.setDatenbankname("java");
	      this.setze_verbindung("sql");
	      this.setze_treiber("sql");
	      this.verbindung();
	   }

	
	public void get_Beitraege(){
		
		String abfrage="Select * from test";
		this.hole_query(abfrage);
		Vector vec=this.fetchAsVector();
		for(int i=0;i<vec.size();i++){
			System.out.println(vec.elementAt(1)+"\t");
		}
	}
		
}
```

Main

```
public class Haupt {

	/**
	 * @param args
	 * Author: Markus Mertens
	 */
	public static void main(String[] args) {
		// TODO Automatisch erstellter Methoden-Stub
		LeseModule lesen=new LeseModule();
		lesen.get_Beitraege();
		lesen.schliesseVerbindung();
		
	}

}
```


----------



## KSG9|sebastian (23. Mai 2006)

Strings vergleicht man immernoch mit equals, genau wie vor 5 Stunden 


```
public void setze_treiber(String wert) { 
      if ("sql".equals(wert)) { 
         this.treiber = "com.mysql.jdbc.Driver"; 
      } 
   } 
}
```
Ansonsten, wie gesagt: Breakpoint in Main und dann step-by-step debuggen


----------

