# java.lang.NullPointerException connection = null



## qtuan3008 (26. Feb 2011)

Hallo ihr lieben,

Ich habe ein Problem...
es gibt Fehler, ich weiß nicht warum, könnte jemand mir helfen.


```
java.lang.NullPointerException
	at Parser.insertValue(Parser.java:136)
	at Parser.endElement(Parser.java:248)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
	at javax.xml.parsers.SAXParser.parse(Unknown Source)
	at javax.xml.parsers.SAXParser.parse(Unknown Source)
	at gui.makeDB(gui.java:87)
	at Main.main(Main.java:7)
```

und mein verkruze code


```
import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
import org.xml.sax.*;
import org.xml.sax.helpers.*;

import java.sql.*;
import java.io.*;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class gui extends DefaultHandler {

	Connection connection;// Die Datenbankverbindung
	Statement statement; // Ein SQL-Statement-Objekt
	PreparedStatement prestatement;
	String driver = "org.postgresql.Driver";
	// --------------------------------------------------------------------------

	String host = "localhost"; // !!! anpassen !!!

	String port = "5432"; // !!! anpassen !!!

	String database = "xml"; // !!! anpassen !!!

	String user = "postgres"; // !!! anpassen !!!

	String password = "eleno308"; // !!! anpassen !!!

	// --------------------------------------------------------------------------
	// jdbc:postgresql:database
	// jdbc:postgresql://host/database
	// jdbc:postgresql://host:port/database

	public String getUrl() {
		return ("jdbc:postgresql:"
				+ (host != null ? ("//" + host)
						+ (port != null ? ":" + port : "") + "/" : "") + database);
	}

	public void loadJdbcDriver() {
		try {
			Class.forName(driver);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			System.exit(1);
		}
		System.out.println("driver loaded");
	}

	public void openConnection() {
		try {
			connection = DriverManager.getConnection(getUrl(), user, password);
		} catch (SQLException e) {
			e.printStackTrace();
			System.exit(1);
		}
		System.out.println("connection opened");
	}

	public void closeConnection() {
		try {
			connection.close();
		} catch (SQLException e) {
			e.printStackTrace();
			System.exit(1);
		}
		System.out.println("\nconnection closed");
	}

	public void makeDB() throws Exception {
		loadJdbcDriver();
		openConnection();
		creatTable();

		closeConnection();
	}

	/* Implementierung JDBC */
	public void creatTable() {
		try {
			statement = connection.createStatement();
			statement.execute("DROP TABLE IF EXISTS page");
			statement.execute("CREATE TABLE page " + "(title VARCHAR(255), "
					+ " id VARCHAR(255), " + " PRIMARY KEY ( id ))");
			statement.close();
		} catch (SQLException e) {
			e.printStackTrace();
			System.exit(1);
		}
		System.out.println("\nCreating table");
	}

	public void insertValue(String title, String id) {
		String abfr;
		try {
			prestatement = connection
					.prepareStatement("INSERT INTO page " + "VALUES (?,?)");
			prestatement.setString(1, title);
			prestatement.setString(2, id);
			prestatement.executeUpdate();
			
			statement.close();
		} catch (SQLException e) {
			e.printStackTrace();
			System.exit(1);
		}
		System.out.println("\nInsert Value");
	}
}
```

ich habe die Stelle gefunden warum Fehlermeldung gibt. und zwar
[JAVA=42]prestatement = connection
					.prepareStatement("INSERT INTO page " + "VALUES (?,?)");[/code]
ich habe

```
System.out.println("connection:" + connection);
```
und die gibt connection: null aus.
Ich habe nicht verstanden warum, weil die Stelle

```
public void openConnection() {
		try {
			connection = DriverManager.getConnection(getUrl(), user, password);
		} catch (SQLException e) {
			e.printStackTrace();
			System.exit(1);
		}
		System.out.println("connection opened");
	}
("connection:" + connection);
```
muss connection schon installiert werden. Und ganz oben habe ich connection Global definiert.


----------



## Antoras (26. Feb 2011)

Und von wo wird 
	
	
	
	





```
openConnection
```
 und 
	
	
	
	





```
insertValue
```
 aufgerufen?


----------



## qtuan3008 (26. Feb 2011)

Antoras hat gesagt.:


> Und von wo wird
> 
> 
> 
> ...




```
openConnection
```
 wird in 
	
	
	
	





```
makeDB
```
 aufgeruft.

```
insertValue
```
 wird in ein 
	
	
	
	





```
public void endElement(String uri, String localName, String rawName)
			throws SAXException {
		if (rawName.equals("title")) {
			inTitle = false;
		}
		if (rawName.equals("id")) {
			inId = false;
		}
		if (rawName.equals("revision")) {
			inRevision = false;
		}
		if (rawName.equals("page")) {
			
			ausString();
			insertValue(stringTitle, intId);
		}
	}
```
aufgeruft.
Ich möchte eine XML datei einlesen, die Information rausholen und dann in eine Datebank speichert 
	
	
	
	





```
insertValue
```


----------



## XHelp (26. Feb 2011)

So auf den ersten Blick hat das nichts mit SQL zu tun. Lässt sich ein KSKB machen?


----------



## Antoras (26. Feb 2011)

In 
	
	
	
	





```
makeDB
```
 wird aber auch 
	
	
	
	





```
closeConnection
```
 aufgerufen.


----------



## qtuan3008 (26. Feb 2011)

Antoras hat gesagt.:


> In
> 
> 
> 
> ...



in 
	
	
	
	





```
makeDB
```
 wird zuerst 
	
	
	
	





```
loadJdbcDriver();
```
, dann 
	
	
	
	





```
openConnection
```
 hier wird 
	
	
	
	





```
connection
```
 installiert, danach wird die 
	
	
	
	





```
Parser.parse(Bz2file, handler);
```
 aufgeruft ----> 
	
	
	
	





```
endElement
```
------>
	
	
	
	





```
insertValue
```
 und zulerst ist 
	
	
	
	





```
closeConnection
```


----------



## qtuan3008 (26. Feb 2011)

XHelp hat gesagt.:


> So auf den ersten Blick hat das nichts mit SQL zu tun. Lässt sich ein KSKB machen?


danke für deinen Tipp
was heißt KSKB. Ich habe gerade gegooglgert, aber nicht gefunden


----------



## Antoras (26. Feb 2011)

Das mit dem Parser steht aber nirgendwo in deinem geposteten Code. Zeig mal den vollständigen Code in dem man die Aufrufreihenfolge erkennen kann oder guck den Code gleich mit einem Debugger durch.

Die Bedeutung von KSKB erfährst du wenn du mit der Maus drüber fährst.


----------



## XHelp (26. Feb 2011)

Fahr einfach mit der Maus auf die nicht ohne Grund unterstrichenen Buchstaben: KSKB


----------



## qtuan3008 (26. Feb 2011)

hier ist mein code


```
import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
import org.xml.sax.*;
import org.xml.sax.helpers.*;

import java.sql.*;
import java.io.*;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class gui extends DefaultHandler {

	Connection connection;// Die Datenbankverbindung
	Statement statement; // Ein SQL-Statement-Objekt
	String driver = "org.postgresql.Driver";
	// --------------------------------------------------------------------------

	String host = "localhost"; // !!! anpassen !!!

	String port = "5432"; // !!! anpassen !!!

	String database = "xml"; // !!! anpassen !!!

	String user = "postgres"; // !!! anpassen !!!

	String password = "eleno308"; // !!! anpassen !!!

	// --------------------------------------------------------------------------
	// jdbc:postgresql:database
	// jdbc:postgresql://host/database
	// jdbc:postgresql://host:port/database

	String stringTitle = "";
	String intId;
	private boolean inTitle = false;
	private boolean inId = false;
	private boolean inRevision = false;

	public String getUrl() {
		return ("jdbc:postgresql:"
				+ (host != null ? ("//" + host)
						+ (port != null ? ":" + port : "") + "/" : "") + database);
	}

	public void loadJdbcDriver() {
		try {
			Class.forName(driver);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			System.exit(1);
		}
		System.out.println("driver loaded");
	}

	public void openConnection() {
		try {
			connection = DriverManager.getConnection(getUrl(), user, password);
		} catch (SQLException e) {
			e.printStackTrace();
			System.exit(1);
		}
		System.out.println("connection opened");
	}

	public void closeConnection() {
		try {
			connection.close();
		} catch (SQLException e) {
			e.printStackTrace();
			System.exit(1);
		}
		System.out.println("\nconnection closed");
	}

	public void makeDB() throws Exception {
		loadJdbcDriver();
		openConnection();
		creatTable();
		
		InputStream file = new FileInputStream("FileTuTao.xml.bz2");
		InputStream Bz2file = new BZip2CompressorInputStream(file);
		SAXParserFactory parserFactory = SAXParserFactory.newInstance();
		SAXParser Parser = parserFactory.newSAXParser();
		gui handler = new gui();
		Parser.parse(Bz2file, handler);

		closeConnection();
	}

	/* Implementierung JDBC */

	public void creatTable() {
		try {
			statement = connection.createStatement();
			statement.execute("DROP TABLE IF EXISTS page");
			statement.execute("CREATE TABLE page " + "(title VARCHAR(255), "
					+ " id VARCHAR(255), " + " PRIMARY KEY ( id ))");
			statement.close();
		} catch (SQLException e) {
			e.printStackTrace();
			System.exit(1);
		}
		System.out.println("\nCreating table");
	}

	public void insertValue(String title, String id) {
		try {

			PreparedStatement statement = connection
					.prepareStatement("INSERT INTO page " + "VALUES (?,?)");
			statement.setString(1, title);
			statement.setString(2, id);
			statement.executeUpdate();

			statement.close();
		} catch (SQLException e) {
			e.printStackTrace();
			System.exit(1);
		}
		System.out.println("\nInsert Value");
	}

	public void startElement(String namespaceURI, String localName,
			String rawName, Attributes attrs) throws SAXException {
		if (rawName.equals("title")) {
			inTitle = true;
		}
		if (rawName.equals("id")) {
			inId = true;
		}
		if (rawName.equals("revision")) {
			inRevision = true;
		}
	}

	public void characters(char[] ch, int start, int length)
			throws SAXException {
		if (inTitle)
			stringTitle = new String(ch, start, length);
		if (inId && !inRevision)
			intId = new String(ch, start, length);
	}

	public void endElement(String uri, String localName, String rawName)
			throws SAXException {
		if (rawName.equals("title")) {
			inTitle = false;
		}
		if (rawName.equals("id")) {
			inId = false;
		}
		if (rawName.equals("revision")) {
			inRevision = false;
		}
		if (rawName.equals("page")) {
			insertValue(stringTitle, intId);
		}
	}

	public void ausString() {
		System.out.println(stringTitle + "  xxx: xxxx  " + intId);
	}

	public void setDocumentLocator(Locator locator) {
	}

	private void Message(String mode, SAXParseException exception) {
		System.out.println(mode + " Line: " + exception.getLineNumber()
				+ " URI: " + exception.getSystemId() + "\n" + " Message: "
				+ exception.getMessage());
	}

	public void warning(SAXParseException exception) throws SAXException {

		Message("**Parsing Warning**\n", exception);
		throw new SAXException("Warning encountered");
	}

	public void error(SAXParseException exception) throws SAXException {

		Message("**Parsing Error**\n", exception);
		throw new SAXException("Error encountered");
	}

	public void fatalError(SAXParseException exception) throws SAXException {

		Message("**Parsing Fatal Error**\n", exception);
		throw new SAXException("Fatal Error encountered");
	}
}
```


----------



## Antoras (26. Feb 2011)

Da haben wir doch schon das Problem:

```
gui handler = new gui();
        Parser.parse(Bz2file, handler);
```
Du erzeugst ein neues Objekt, das eine uninitialisierte Connection beinhaltet und übergibst dieses Objekt an deinen Parser, anstatt das momentane Objekt zu übergeben. Fürs erste dürfte es reichen die beiden Zeilen durch 
	
	
	
	





```
Parser.parse(Bz2file, this);
```
 zu ersetzen.


----------



## XHelp (26. Feb 2011)

Du erstellst ja auch eine neue gui-Instanz (übrigens werden Klasse in UpperCamelCase geschrieben). übergib einfach 
	
	
	
	





```
this
```
 als handler


----------



## qtuan3008 (26. Feb 2011)

Antoras hat gesagt.:


> Da haben wir doch schon das Problem:
> 
> ```
> gui handler = new gui();
> ...


stimmt, Vielen Dank an Antoras und XHelp!!!. Ich werde versuchen zu korrigieren.


----------



## qtuan3008 (26. Feb 2011)

XHelp hat gesagt.:


> Du erstellst ja auch eine neue gui-Instanz (übrigens werden Klasse in UpperCamelCase geschrieben). übergib einfach
> 
> 
> 
> ...



Ich habe gerade probiert mit 
	
	
	
	





```
this
```
. Hat gut geklappt. Danke für deinen Tipp. Eigentlich sollte ich keine neue Objecten erzeugen, die brauchen viel Arbeitspeicher, passt nicht zu meiner Project.
Ich wünsche euch einen schönen Rest Samstag.


----------

