connection_1 ist möglicherweise nicht initialisier

Von: , Frage gestellt am Di, 1. Mär 2005

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 <code>connection_1.close();</code>
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 :)
Ü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 <= numCols ;i++){
// Mittels resultSet_1.getString(1) wird die erste Spalte ausgegeben.
String erg = resultSet_1.getString( i );
System.out.print( erg + "  " ) ;
// System.exit(1); beendet das Programm und zeigt einen Fehlertext
// System.exit(0); beendet das Programm (zeigt keinen Fehlertext)
} } }
catch ( SQLException sqlException_1 ) {
/* In der catch-Klausel wird nicht nur die Art des abzufangenden Fehlers definiert,
sondern auch ein formaler Parameter angegeben (hier sqlException_1),
der beim Auftreten der Ausnahme ein Fehlerobjekt übernehmen soll. 
Alle Laufzeitfehler in Java sind Unterklassen der Klasse Throwable.
*/
/* Die Klasse SQLException
Wenn SQL-Anweisungen fehlschlagen, lösen sie normalerweise 
eine Ausnahme des Typs SQLException aus.
Das gilt sowohl, wenn keine Verbindung zur Datenbank zustande gekommen ist,
als auch bei allen Arten von Syntaxfehlern in SQL-Anweisungen. 
Auch bei semantischen Fehlern durch falsche Typisierung 
oder inhaltlich fehlerhafte SQL-Anweisungen wird eine solche Ausnahme ausgelöst. 
SQLException ist eine Erweiterung der Klasse Exception. 
*/
if( true ){
// Eine Möglichkeit der Ausgabe von SQL-Fehlern.
System.out.println( "sqlException_1=" + sqlException_1 );
}else
// Eine andere Möglichkeit der Ausgabe von SQL-Fehlern.
while ( sqlException_1 != null) {
System.err.println(sqlException_1.toString());
System.err.println("SQL-State: " + sqlException_1.getSQLState());
// getSQLState liefert den internen SQL-Zustandscode.
System.err.println("ErrorCode: " + sqlException_1.getErrorCode());
// getErrorCode liefert herstellerspezifischen Fehlercode.
sqlException_1 = sqlException_1.getNextException();
/* getNextException
Etwas ungewöhnlich ist die Methode getNextException, 
denn sie unterstützt die Verkettung von Ausnahmen. 
Jeder Aufruf holt die nächste Ausnahme aus der Liste. 
Ist der Rückgabewert null, gibt es keine weiteren Ausnahmen.
*/
}
}
catch (Throwable thr) {
// Alle Laufzeitfehler in Java sind Unterklassen der Klasse Throwable.
// Oben werden daher vermutlich, alle (restlichen) Fehler abgefangen.
thr.printStackTrace();
}
/* Der Bereich finally wird auf jeden Fall durchschritten.
Die finally-Klausel ist also der ideale Ort, 
um Aufräumarbeiten durchzuführen. 
Hier können beispielsweise Dateien geschlossen oder Ressourcen freigegeben werden.
*/
finally {
try {
connection_1.close();
ausgabe = "\n close() " 
+ "\n gibt die Ressourcen eines Statementobjekts wieder frei.";
System.out.println( ausgabe_anfang + "connected to database" + ausgabe);
}
catch (Throwable thr2) {}
}
System.out.println("Hello world 2 ! Hier endet das Programm.");
} }

4 Antworten zu dieser Frage

  1. Antwort von nach 11 Minuten 0 hilfreich
    Re: connection_1 ist möglicherweise nicht initiali

    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

    • Antwort von nach 18 Stunden 0 hilfreich
      Danke :) das wars, aber versteh ich noch nicht gan

      Hi Patrick :)

      Hatte auch schon versucht Connection connection_1;
      zu initialisieren, wusste nicht wie :) 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

      • Antwort von nach 20 Stunden 1 hilfreich
        Re: Danke :) das wars, aber versteh ich noch nicht

        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. :-)

        Gruss, Patrick

        • Antwort von nach 22 Stunden 0 hilfreich
          Oh :) Ahh.. danke.. stimmt ja :)

          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 :))
          "ggfs. " war das Zauberwort.

          Gruss, Sebastian

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!