# Fehler bei Ausgabe der Daten aus der DB



## Ingerten (16. Dez 2014)

Hallo Männers,

ich habe da ein Problem, da werde ich nicht schlau draus, ich weiss nicht ob ich mir da selbst ein Fehler eingebaut habe oder da eine Regel nicht beachte.

Ich habe mal versucht mit Java eine Datenbank(Access) auszulesen, es ist für mich das erste mal, das ich mit Java eine DB bearbeite oder besser gesagt, was auslesen will.

Das hat auch soweit ganz gut geklappt, solange ich den Inhalt der DB mit "System.out.println()" ausgegeben habe.

Aber dann dachte ich mir, mach doch einfach ein Frame mit Textarea und lass die Ausgabe mit dem Befehl "Frame.textArea.append(DBinhalt)", da anzeigen.

Und ab da will er nicht mehr.

Fehlermeldung: 
Exception in thread "main" java.lang.NullPointerException
	at main.DBConnect.abfrage(DBConnect.java:29)
	at main.Frame.main(Frame.java:32)


```
package main;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DBConnect {
private static Connection con;

	public DBConnect() {
		
		Statement s;
		
		try {
			connect("db.mdb", "", "");

					s = con.createStatement();
			 ResultSet res= s.executeQuery("select * from Tabelle1");

       
        String t;
        while (res.next()) {

           // hier entsteht der Fehler, wenn ich 
            "System.out.println(res.getString("Feld1"));" 
           // einsetze dann ist alles OK, wenn ich 
            "t=res.getString("Feld1"); Frame.textArea.append(t);"
           //dann kommt ein fehler

        }

        res.close(); s.close(); con.close();  
			
		} catch (ClassNotFoundException | SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}

	public boolean connect(String filename, String user, String passwd)
		   throws SQLException, ClassNotFoundException {
		 
		   String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=D:/"
		      + filename + ";READONLY=false}";      
		 
		   Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
		   con = DriverManager.getConnection(url, user, passwd);

		   return true;
		}
	
       
	

}
```



```
package main;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextArea;

public class Frame extends JFrame {

	private JPanel contentPane;
	public static JTextArea textArea;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Frame frame = new Frame();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
		
		DBConnect DBC = new DBConnect();
		
	}

	/**
	 * Create the frame.
	 */
	public Frame() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		textArea = new JTextArea();
		textArea.setBounds(5, 5, 424, 245);
		contentPane.add(textArea);
	}

}
```


----------



## VfL_Freak (16. Dez 2014)

Moin,

bin zwar aus Deinem Code nicht ganz schlau geworden, aber vermutlich geht es ja wohl um diese Zeilen

```
t=res.getString("Feld1");
Frame.textArea.append(t);
```
Ich denke, dass an der Stelle 'Frame' nicht bekannt und somit NULL ist!
Das kannst Du ganz einfach per Debugger prüfen!

Gruß
Klaus


----------



## Ingerten (16. Dez 2014)

hmm, du hattest recht, 

ich habe es jetzt nochmal anders geschrieben und jetzt klappt es.
Ich war mir eigentlich fast sicher, der "Frame" an der stelle schon bekannt sein sollte.

Aber was solls, danke für deine Hilfe und Entschuldigung das ich euch wegen so einem dummen Fehler, die Zeit raube.


----------



## Harry Kane (16. Dez 2014)

Mir deucht das ganze ein klassiches race condition Problem zu sein:
Du konstruierst in einem separaten Thread dein Frame. Erst wenn der Konstruktor von Frame Zeile 47 erreicht hat, ist textArea nicht mehr null.
Der Konstruktor von DBConnect wird aber unabhängig von dem ersten Thread aufgerufen. Ich vermute, daß der Konstruktor von DBConnect die Zeile "t=res.getString("Feld1"); Frame.textArea.append(t);" erreicht, bevor der Konstruktor von Frame textArea auf nicht null setzt.
Der Code sieht übrigens stark verbesserubgsfähig aus: Mischmasch von static und nicht static, Mischmasch von Abfragelogik und Gui, public Variablen, und eine Frame-Klasse, die unnötigerweise JFrame erweitert und auch noch so heisst wie eine Java-Standardklasse.


----------

