connection_1 ist möglicherweise nicht initialisier

Hi ich bin eigentlich sehr froh, mein erstes Java Progrämmchen, das mit DB2 arbeitet, läuft ganz nett… bis auf eine Unwesentlichkeit.

Ganz am Ende des Quelltextes stöhrt sich der Compiler daran,
dass connection_1.close();
geschlossen werden soll, was ich aber gar nicht einsehen kann.
Kommentiere ich die Zeile aus läuft alles prima.

Es meldet:
Exception in thread „main“ java.lang.Error: Unaufgelöstes Kompilierungsproblem:
Die lokale Variable connection_1 ist möglicherweise nicht initialisiert.

Ich kopier hier mal den kompletten Code rein,
ihr seht sicher gleich wo der Hacken ist. Danke :smile:
Übrigens, als nächsten Schritt muss ich diese Applikaton in ein Applet umwandeln… ist das einfach?

import java.sql.\* ;

public class HelloWorld {
 // public - Nur Klassen, die als public deklariert wurden, sind außerhalb des Pakets sichtbar, in dem sie definiert wurden. 

 public static void main(String[] args) {
 /\* 
 public 
 Membervariablen und Methoden vom Typ public sind im Rahmen ihrer Lebensdauer überall sichtbar. 
 Sie können daher in der eigenen Klasse und von beliebigen Methoden anderer Klassen verwendet werden.

 static
 Variablen und Methoden mit dem Attribut static sind nicht an die Existenz 
 eines konkreten Objekts gebunden, 
 sondern existieren vom Laden der Klasse bis zum Beenden des Programms. 
 \*/
 System.out.println("Hello world 1 !");
 /\* #$hDB = odbc\_connect('datenquelle','sasaus42','milchshake');
 if( !$hDB = odbc\_connect('datenquelle','','') ){ \*/
 //final String url = "datenquelle";
 final String url = "jdbc:db2:test" , user = "" , pass = "" ;
 final String ausgabe\_anfang = "\n\_\_\_\_\_\_\_\_\_\_\_\_\_\n"; 
 /\* final 
 Membervariablen mit dem Attribut final dürfen nicht verändert werden, sind also als Konstanten anzusehen. \*/ 
 Connection connection\_1; String ausgabe; ResultSet resultSet\_1;

 try {
 Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");
 connection\_1 = DriverManager.getConnection(url, user, pass);
 ausgabe = "\n getConnection() ist zustaendig fuer den Aufbau einer Verbindung zu einer Datenbank" 
 + "\n und existiert in zwei Varianten: mit Angabe von Benutzername und Passwort und"
 + "\n ohne diese Angabe.";
 System.out.println( ausgabe\_anfang + "connected to database" + ausgabe);

 /\* createStatement erzeugt Statement- Object.
 Statement- Object kann dazu verwendet werden unparametrisierte Abfragen und 
 Änderungen zu erzeugen. \*/
 Statement statement\_1 = connection\_1.createStatement();
 //System.out.println( ausgabe\_anfang + "statement\_1=" + statement\_1 );
 resultSet\_1 = statement\_1.executeQuery("SELECT \* FROM BERG");
 ResultSetMetaData resultSetMetaData\_1 = resultSet\_1.getMetaData();
 /\* getMetaData
 Nachdem die Verbindung hergestellt wurde, 
 liefert der Aufruf von getMetaData ein Objekt des Typs DatabaseMetaData. 
 Es kann dazu verwendet werden, weitere Informationen über die 
 Datenbank abzufragen. \*/

 int numCols = resultSetMetaData\_1.getColumnCount();
 /\* statement\_1.getResultSet() 
 gibt eine risiege Menge informativem Text aus.
 Das Objekt ResultSet repräsentiert die Ergebnismenge. \*/

 while( resultSet\_1.next() ){
 System.out.println( ausgabe\_anfang ) ;
 for(int i = 1; i 

Hi

Connection connection\_1;
...
connection\_1 = DriverManager.getConnection(url, user,pass);
...
finally {
 try {
 connection\_1.close();
 }
 catch (Throwable thr2) {}
}

Wenn dein Programm bei …getConnection() wegfliegt, dann
ist connection_1 nicht initialisiert und hat keinen definierten
Zustand.
Beheben kannst du das in etwa so:

Connection connection\_1 = null;
...
connection\_1 = DriverManager.getConnection(url, user,pass);
...
finally {
 if (connection\_1 != null)
 try {
 connection\_1.close();
 }
 catch (Throwable thr2) {}
 }
}

Gruss, Patrick

Danke :smile: das wars, aber versteh ich noch nicht gan
Hi Patrick :smile:

Hatte auch schon versucht

Connection connection_1;

zu initialisieren, wusste nicht wie :smile:

Wenn dein Programm bei …getConnection() wegfliegt

Ja stimm, aber es flog übrigens nie bei getConnection()
weg.
Es wurde im try-Block ja immer richtig initialisiert, so das dann auch dort mit getConnection() fehlerfrei gearbeitet werden konnte.

Aber im finel - Block, der in der Hirarch-(Verschachtelungstiefe) auf gleicher Höhe, klappte das

connection_1.close();

nicht mehr.
Ja, mein Reim: Weil es da nicht mehr initialisiert war…
aber eigentlich verstehe ich das nicht ganz.

Definiert war die Variable doch für die ganze Methode, also auch für die Blöcke, try, catch und final.
Nur eben noch nicht initialisiert.
Siehe deine Lösung:
Connection connection_1 = null;

Geht tatsächlich die Änderung (bzw. Initialisierung), in einem tieferen Block, einer Variablen, die jedoch in der Methode deklariert ist, verlohren ?

Versteh ich nicht ganz.

LG Sebastian

Geht tatsächlich die Änderung (bzw. Initialisierung), in einem
tieferen Block, einer Variablen, die jedoch in der Methode
deklariert ist, verlohren ?

Nein, die Gueltigkeit der Variablen geht innerhalb eines
Blockes nicht verloren.

Es motzt ja auch nur der Compiler und weist dich darauf
hin, dass zur Laufzeit ggfs. undefinierte Zustaende herrschen.
Naemlich genau dann, wenn die Anwendung bei …getConnection
wegfliegt. Und dann ist connection_1 im finally-Block
undefiniert, da vorher nicht initialisiert, sondern nur
deklariert.

Mit null hat connection_1 einen definierten Zustand und
es kann nichts passieren, ausser einer NullPointerException,
die du natuerlich abfangen musst. :smile:

Gruss, Patrick

1 „Gefällt mir“

Oh :smile: Ahh… danke… stimmt ja :smile:

Es motzt ja auch nur der Compiler und weist dich darauf
hin, dass zur Laufzeit ggfs. undefinierte Zustaende herrschen.

Jo, das hab ich jetzt kapiert. Danke :smile:)
"ggfs. " war das Zauberwort.

Gruss, Sebastian