Datenbank bei Klassenverteilung führt zu NullPointerException

Ich bitte um einen Denkanstoß bei einem Anfängerproblem. Ich hoffe, ihr könnt mir helfen. Ich sitz schon den ganzen Tag und durchstöber das Web.

Problem:
Verteilung von Driver, Connection, Statement und Resultset auf verschiedene Klassen. Wenn alles in der Klasse db_connection ist, funktioniert es, aber bei der Verteilung nicht. Ich denk mal, dass das Problem bei der Vererbung liegt, denn db_resultset müsste wohl auch von db_connection erben. Dies ist natürlich nicht möglich.

Fehlermeldung: NullPointerexception.

Exception in thread "main" Verbindung hergestellt
java.lang.NullPointerException
at Datenhaltung.db_statements.db_createStatement(db_statements.java:27)
at Datenhaltung.dbMain.main(dbMain.java:20)



[JAVA=42]
public class db_connection {

private String dbHostname = "***";
private String dbPort ="1521";
private String dbName = "***";
private String dbUser = "***";
private String dbPassword = "**";
private Connection conn = null;

public Connection getConn() {
return conn;
}

public void setConn(Connection conn) {
this.conn = conn;
}



public Connection db_connect ()
{

try {
System.out.println("* Verbindung aufbauen");
String url = "jdbc:eek:racle:thin:mad:"+dbHostname+":"+dbPort+":"+dbName;
conn = DriverManager.getConnection(url, dbUser, dbPassword);
System.out.println("Verbindung hergestellt");
// conn.setAutoCommit(false);
}


catch (SQLException sqlconnect)
{
System.out.println("SQLException: " + sqlconnect.getMessage());
System.out.println("SQLState: " + sqlconnect.getSQLState());
System.out.println("VendorError: " + sqlconnect.getErrorCode());
sqlconnect.printStackTrace();
}
return conn;
}


public void db_close()
{
System.out.println("* Datenbank-Verbindung beenden");
try
{
conn.close();
System.out.println("Verbindung geschlossen");
}

catch (SQLException sqlclose)
{
System.out.println("SQLException: " + sqlclose.getMessage());
System.out.println("SQLState: " + sqlclose.getSQLState());
System.out.println("VendorError: " + sqlclose.getErrorCode());
sqlclose.printStackTrace();
}
}


[/code]

Die Verbindung wird hergestellt und geschlossen, wenn nur die klasse db_connection und driver genutzt wird.


[JAVA=42]
public class db_statements extends db_connection {

private Statement stmt = null;

public Statement getStmt() {
return stmt;
}

public void setStmt(Statement stmt) {
this.stmt = stmt;
}

public Statement db_createStatement()
{

try {
stmt = getConn().createStatement();
} catch (SQLException e) {
e.printStackTrace();
}

return stmt;
}


public void db_closeStatement ()
{
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

[/code]

Ich denke, es ist sinnvoll, eine eigene Klasse für die Statements zu erstellen. Hatte diese vorher auch bei der Connection, find es aber aufgeteilt schöner.

[JAVA=42]
public class db_resultsets extends db_statements{

public void resultNames()
{
try {
ResultSet kunden = getStmt().executeQuery("SELECT * FROM kunde");
while (kunden.next())
{
String name = kunden.getString("Name");
System.out.println(name);
}
}

catch (SQLException rsetNamen)
{
rsetNamen.printStackTrace();
}



}



}

[/code]



[JAVA=42]
public class db_driver {

public void db_registerDriver()
{

try {
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
System.out.println("Treiber geladen");



} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


[/code]

Hier noch die Main...
[JAVA=42]
public class dbMain {

/**
* @param args
*/
public static void main(String[] args) {

//Klassen erzeugen
db_driver dbdriver = new db_driver();
db_connection dbconn = new db_connection();
db_statements dbstmt = new db_statements();
db_resultsets dbrset = new db_resultsets();


dbdriver.db_registerDriver();
dbconn.db_connect();
dbstmt.db_createStatement();

dbrset.resultNames();

dbstmt.db_closeStatement();
dbconn.db_close();
}

}


[/code]
 
Zuletzt bearbeitet:

Final_Striker

Top Contributor
[c]stmt = getConn().createStatement();[/c]

[c]getConn()[/c] liefert [c]null[/c], weil du zuvor keine Verbindung mit [c]db_connect ()[/c] aufgebaut hast.

Edit:

Außerdem ist dein Aufbau sehr seltsam.

[c]public class db_statements extends db_connection {[/c]

Ein Statement braucht eine Connection, ist aber keine Connection.

[c]public class db_resultsets extends db_statements{[/c]

Hier genauso. Ein Statement liefert ein Resultset zurück, ein Resultset ist aber kein Statement.


Du solltest dir nochmal den Unterschied zwischen Vererbung und Aggregation klar machen.
 
Zuletzt bearbeitet:
Danke für die schnelle Antwort!

Vererbung war hier echt nicht gerade die Superidee...
Über die Umsetzung der Aggregation muss ich auch noch einiges lesen, genauso wie Interfaces...
Die Beziehungen sind zumindest soweit klar.

Spricht was dagegen, dass conn und stmt static sind? Pro Sitzung werden diese einmal aufgerufen. Ich habe das jetzt einfach so verändert...
conn und stmt static
Code:
stmt = db_connection.getConn().createStatement();
beim Resultset natürlich auch.
Die extends natürlich raus. Es ist jetzt zumindest lauffähig, obwohl unelegant.

Nachdem ich dann die Exception-Behandlung fertig habe, werd ich mich nochmal ransetzen.
Ich hoffe, die Fragen sind nicht zu sehr Noob und ich werde hier nicht rausgeschmissen, wenn nochmal sowas kommt.
 

Crian

Top Contributor
Statisch sollte man weitestgehend vermeiden. Wenn man unbedingt nur genau eine Ausprägung einer Klasse zulassen will, dann nutzt man das Singleton-Pattern*.

Ansonsten macht man sich eigentlich nur unnötige Probleme damit.




* Führt hier vermutlich zu weit, aber ganz kurz gesagt: Eine ganz normale Klasse, die aber einen privaten Konstruktor hat und eine statische Methode, die beim ersten Aufruf eine Instanz anlegt und zurück gibt und bei weiteren Aufrufen die schon angelegte Instanz zurück gibt.
 

Empire Phoenix

Top Contributor
Glaubenssache, static kann bie sachen die Programmweit static sind auch benutzt werden. Problem dabei in diesem fall ist jedoch, dass du nicht sicherstellen kannst das auch wirklich die variable immer Inhalt hat egal an welcher stelle man sie aufruft (macht bei größeren programmen dann probleme wenn man sowas vergisst)
 
Danke erstmal für die Infos!
Static scheint wohl nicht wirklich elegant zu sein...
Assoziationen umzusetzen werde ich wohl später versuchen, in UML ist das iwie leichter.
Eine Möglichkeit wäre noch Instanzen von den einzelnen Klassen zu erzeugen, was ich mir auch erspare. Ich habe wieder alles in eine Klasse gepackt und es läuft soweit.

Jetzt habe ich ein neues Problem mit dem ich absolut nicht weiterkomme!
Das resultset in einer Hashmap zu speichern, bei der der Key die Kundennummer ist. Ich verstehe das Prinzip scheinbar nicht! Ich hab schon so viel gegoogelt, aber keine Chance.

Ich hab mir folgendes überlegt...
Java:
    public HashMap<String, Customer> getAllCustomers() //throws Exception
    {
    	HashMap<String, Customer> customerResult = new HashMap<String, Customer>();
    	String queryGetCustomers = "SELECT customerNr, customerTitle, customerName, customerFirstname, customerStreet, customerStreetNr, customerPostcode, customerCity FROM customer ORDER BY customerNr ASC";
    	
    	try 
    	 {
    		 ResultSet rset = stmt.executeQuery(queryGetCustomers);    		 
    		 Customer customer = new Customer();
    		 while (rset.next())
    		 {    			 

    			 // Zugriff auf die höhere Schicht!!!!! ALARM!!
    			 
    		
    			 
    			 customer.setCustomerNr(rset.getString("customerNr"));
    			 customerResult.put(customer.getCustomerNr(), customer);
    			 
    			 customer.setCustomerTitle(rset.getString("customerTitle"));
    			 customerResult.put(customer.getCustomerNr(), customer);
//    			 customerResult.put(customer.getCustomerTitle(), customer);
    			 
    			 customer.setCustomerName(rset.getString("customerName"));
    			 customerResult.put(customer.getCustomerNr(), customer);
//    			 customerResult.put(customer.getCustomerName(), customer);
    			 
    			 customer.setCustomerFirstname(rset.getString("customerFirstname"));
    			 customerResult.put(customer.getCustomerNr(), customer);
//    			 customerResult.put(customer.getCustomerFirstname(), customer);
    			 
    			 customer.setCustomerStreet(rset.getString("customerStreet"));
    			 customerResult.put(customer.getCustomerNr(), customer);
//    			 customerResult.put(customer.getCustomerStreet(), customer);
    			 
    			 customer.setCustomerStreetNr(rset.getString("customerStreetNr"));
    			 customerResult.put(customer.getCustomerNr(), customer);
//    			 customerResult.put(customer.getCustomerStreetNr(), customer);
    			    			 
    			 customer.setCustomerPostcode(rset.getString("customerPostcode"));
    			 customerResult.put(customer.getCustomerNr(), customer);
//    			 customerResult.put(customer.getCustomerPostcode(), customer);
    			 
    			 customer.setCustomerCity(rset.getString("customerCity"));
    			 customerResult.put(customer.getCustomerNr(), customer);
//    			 customerResult.put(customer.getCustomerCity(), customer);
    		 }
    			 return customerResult;
... + Exception...

Dann versuche ich das in einer gui in eine Tabelle zu schreiben:
Java:
public Object getValueAt(int row, int col)  
	{	
		return tableData.entrySet().toArray()[row]; // tableData ist customerResult aus der oberen klasse. Sonst nehm ich da auch keySet()...
	}

Ausgabe:
- So: In jeder Zeile wird nur der Key angezeigt, je Zeile immer der Gleiche, also 3 3 3 3 3 ...
- Die // hab ich vorher probiert, da standen halt die richtigen Daten drin, nur je Zeile immer der Gleiche, also vorname vorname vorname...



Probleme:
- Alle Daten haben den gleichen Key!

Fragen:
- Muss ich eine neue Hashmap mit einem Int customerNr erstellen oder geht das auch so?
- Wie kann ich jedem Kunden eine eigenen Key zuweisen? (warum geht das mit customerNr nicht?)
- Was läuft hier allgemein falsch?
 
Zuletzt bearbeitet:

r.w.

Bekanntes Mitglied
Hallo rushinsquirrel,

Danke erstmal für die Infos!

Probleme:
- Alle Daten haben den gleichen Key!

ich würde eher tippen, dass jeder Key 8 Mal vorkommt.

Fragen:
- Muss ich eine neue Hashmap mit einem Int customerNr erstellen oder geht das auch so?
- Wie kann ich jedem Kunden eine eigenen Key zuweisen? (warum geht das mit customerNr nicht?)
- Was läuft hier allgemein falsch?

zu 1)
Nein, es geht auch so.

zu 2) und 3)
Es reicht völlig, wenn Du das Customer-Objekt an die HashMap hängst, nachdem Du
alle Felder eingelesen hast. Du machst das hier nach jedem eingelesenen Feld. ;-)

Ich hoffe, ich konnte Dir weiterhelfen.

VG ROlf
 
Danke Rolf,
klingt irgendwie logisch... Ich habe jetzt einfach dem Customer die Werte zugeordnet und ihn am Ende der Hashmap hinzugefügt.

Habe heute erfahren, dass es keine gute Idee ist, die Kunden in einer HashMap zu speichern. Hab jetzt einen Vector genommen und diesen dann in den JTable eingetragen. Funktioniert soweit und ich bin begeistert.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Erste Schritte Einfache Datenbank-Webseite erstellen als Nicht-IT-lerin Java Basics - Anfänger-Themen 24
M Daten aus errechneter Methode in Datenbank(SQLite) schreiben Java Basics - Anfänger-Themen 60
S Best Practice Fragen zu Projektstruktur einer Datenbank-Abfrage-App (MVC) Java Basics - Anfänger-Themen 13
I Element n aus Datenbank Query (JPA / Hibernate) Java Basics - Anfänger-Themen 3
I Passwort in Datenbank speichern um später wieder auszulesen Java Basics - Anfänger-Themen 5
S OOP Java Eingabe in verschiedene Datenbank Tabellen eintragen Java Basics - Anfänger-Themen 7
I H2 Datenbank starten / Daten in File speichern Java Basics - Anfänger-Themen 25
E schneller von der Datenbank abfragen Java Basics - Anfänger-Themen 15
E Datenbank Spalte zusammenzählen Java Basics - Anfänger-Themen 2
R Datenbank Java Basics - Anfänger-Themen 1
I API Key´s in der Datenbank decrypt / encrypten? Java Basics - Anfänger-Themen 23
I Werte (u.a. Geldbeträge) in Datenbank speichern und Rundungen? Java Basics - Anfänger-Themen 8
M Mehrere Datenbank zugriffe über tomee.xml regeln? Java Basics - Anfänger-Themen 1
M Datenbank oder Textdatei? Java Basics - Anfänger-Themen 4
S Datenbank Befehl nach Login Java Basics - Anfänger-Themen 5
S Datenbank Tabelle eine Zeile an einer bestimmten Stelle einfügen Java Basics - Anfänger-Themen 2
M Von der Datenbank zum Textfield Java Basics - Anfänger-Themen 16
R Best Practice Logik in der Datenbank oder in Java? Java Basics - Anfänger-Themen 3
R Datenbank-Werte dynamisch ausgeben Java Basics - Anfänger-Themen 19
B Frage zu Datenbank Design - Rechnungen, Angebote... und deren Positionen Java Basics - Anfänger-Themen 4
B Datenbank: Entity mit vielen Referenzen? Ansatz so ok? Java Basics - Anfänger-Themen 8
T Datenbank | Welche am Sinnvollsten? Java Basics - Anfänger-Themen 5
S Daten speichern, ohne Datenbank Java Basics - Anfänger-Themen 8
L Daten aus ArrayList in Datenbank durchsuchen Java Basics - Anfänger-Themen 5
M Datenbank in jTable Laden Java Basics - Anfänger-Themen 49
M Datenbank verbindung Java Basics - Anfänger-Themen 19
J Java Verbindung mit mysql Datenbank Java Basics - Anfänger-Themen 3
B Datenbank, aktuelle Ende als Zahl an Label übergeben Java Basics - Anfänger-Themen 7
T Collections Geeignete Collection/Liste/Datenbank Java Basics - Anfänger-Themen 17
B Treetable (rekursive Funktion) aufbauen von Datenbank Java Basics - Anfänger-Themen 4
R Input/Output Verbindung mit mySql-Datenbank Java Basics - Anfänger-Themen 9
D Compiler-Fehler Wert auf Datenbank übertragen und Sleep Thread Java Basics - Anfänger-Themen 3
N (Java) Regristrierung und Login System mit einer Datenbank Java Basics - Anfänger-Themen 5
J Datenbank Zugriff Java Basics - Anfänger-Themen 24
J Mit JSF Formular in Datenbank schreiben Java Basics - Anfänger-Themen 3
DaCrazyJavaExpert Verschiede Aktionen der Datenbank getrennt durchführen Java Basics - Anfänger-Themen 4
DaCrazyJavaExpert Datenbank wird nicht erstellt Java Basics - Anfänger-Themen 31
E Daten gehen nicht in Datenbank Java Basics - Anfänger-Themen 14
C JTable update mit MySQL Datenbank Java Basics - Anfänger-Themen 1
Meeresgott OOP Gui, Logik und Datenbank richtig aufbauen Java Basics - Anfänger-Themen 43
B Schreiben von zu vielen Einträgen in einer Datenbank Java Basics - Anfänger-Themen 9
S Datenbank auf Knopfdruck abfragen Java Basics - Anfänger-Themen 8
M Java als Webanwendung mit Datenbank abfrage Java Basics - Anfänger-Themen 3
N Datenbank mit GUI verbinden - Wie? Java Basics - Anfänger-Themen 5
1 Datenbank in Java Java Basics - Anfänger-Themen 1
M Erste Schritte Java Applet - HTML Seiten auslesen und in Access Datenbank schreiben? Java Basics - Anfänger-Themen 15
J Bücher Datenbank Java Basics - Anfänger-Themen 5
S Best Practice MVC und große Datenmengen aus einer mySQL - Datenbank Java Basics - Anfänger-Themen 24
J Datum und Uhrzeit in Datenbank falsch hinterlegt Java Basics - Anfänger-Themen 13
R Erstversuch Datenbank Java Basics - Anfänger-Themen 6
I Daten speichern ohne Datenbank Java Basics - Anfänger-Themen 20
A Erste Schritte Verbindung zu MySQL Datenbank herstellen Java Basics - Anfänger-Themen 7
T Sql Datenbank - variable übergeben? Java Basics - Anfänger-Themen 8
C Passwörter möglichst sicher in Datenbank speichern Java Basics - Anfänger-Themen 18
W Erste Schritte Exceltabelle in Datenbank übertragen mittels XDEV Java Basics - Anfänger-Themen 7
J GUI mit phpMyAdmin Datenbank verbinden Java Basics - Anfänger-Themen 0
K Erste Schritte Datenbank SQL erklärung Java Basics - Anfänger-Themen 15
B Lokale Datenbank Java Java Basics - Anfänger-Themen 2
B Klassen Doppelte werte Filtern XML, Datenbank und DOM Java Basics - Anfänger-Themen 3
Todesbote Int Array mit Hibernate in Datenbank speichern. Java Basics - Anfänger-Themen 2
U Datenbank in Java Java Basics - Anfänger-Themen 8
M Keine Datenbank verbindung Java Basics - Anfänger-Themen 14
N mit Werten aus einer mysql datenbank in java rechnen Java Basics - Anfänger-Themen 17
Q Datenbank nicht über separaten Server Java Basics - Anfänger-Themen 4
B Dateiname in Datenbank schreiben Java Basics - Anfänger-Themen 2
J fortlaufende Objekte durch Variable auswählen; Datenbank Java Basics - Anfänger-Themen 4
S ArrayList in mysql Datenbank speichern Java Basics - Anfänger-Themen 6
C Datenbank - Welche Java Basics - Anfänger-Themen 5
B Java Objektorientierte Datenbank - Assoziation Hilfe Java Basics - Anfänger-Themen 4
G Input/Output Serialisierung oder Datenbank Java Basics - Anfänger-Themen 6
J Erste Schritte Objekte in Datenbank speichern Java Basics - Anfänger-Themen 26
A Android Datenbank gaaanz einfaches Insert geht nicht - warum? Java Basics - Anfänger-Themen 4
L Erste Schritte Datenbank Zugangsdaten sicher? Java Basics - Anfänger-Themen 15
S Input/Output Primzahlen Datenbank Java Basics - Anfänger-Themen 11
B Mit Java-Programm Daten aus MySQL-Datenbank auslesen, lokal und nicht lokal. Java Basics - Anfänger-Themen 10
K Input/Output Datenbank Java Basics - Anfänger-Themen 27
M Datenbank in die Gui Java Basics - Anfänger-Themen 4
J JTable mit Daten aus Datenbank füllen Java Basics - Anfänger-Themen 3
F Erfassung von PCs in eine SQLite-Datenbank über JDBC Java Basics - Anfänger-Themen 9
T Datenbank Abfrage Exception Null Java Basics - Anfänger-Themen 2
M Brauche ich ein Datenbank oder nicht? Java Basics - Anfänger-Themen 6
D JDBC Datenbank fail?! Java Basics - Anfänger-Themen 20
A Problem beim einfügen in eine Datenbank Java Basics - Anfänger-Themen 2
F Classpath Datenbank ... nur wo? Java Basics - Anfänger-Themen 24
H Datenbank suche in kleine Schritte Java Basics - Anfänger-Themen 6
B Personalnummer aus Datenbank Java Basics - Anfänger-Themen 3
M Welche Datenbank? Java Basics - Anfänger-Themen 5
J RadioButtonInhalt in Datenbank übergeben Java Basics - Anfänger-Themen 3
J PW von Datenbank wie abspeichern? Java Basics - Anfänger-Themen 2
F Verbindung zu MySql Datenbank Java Basics - Anfänger-Themen 4
MU5T4NG JPasswordField als Hash in Datenbank abspeichern Java Basics - Anfänger-Themen 3
J Kleine Datenbank programmieren Java Basics - Anfänger-Themen 2
J Eigene kleine Datenbank programmieren Java Basics - Anfänger-Themen 2
F Collections Datenbankdaten in einer Map speichern, bearbeiten, sortieren und wieder in Datenbank schreiben Java Basics - Anfänger-Themen 20
T Zugangsdaten für Datenbank in Java-Programm speichern? Java Basics - Anfänger-Themen 5
S Schnittstelle für Datenbank bzw. Dateiformat Java Basics - Anfänger-Themen 2
C ComboBoxModel mit Daten der Datenbank verändern Java Basics - Anfänger-Themen 2
T Datenbank automatisch erzeugen beim ersten Start Java Basics - Anfänger-Themen 6
I Datenbank - nach erster Verbindung keine Verbindung mehr Java Basics - Anfänger-Themen 3
F Datenbank in eine Textdatei speichern Java Basics - Anfänger-Themen 13

Ähnliche Java Themen

Neue Themen


Oben