2016-04-30 7 views
0

Ich erstelle eine einfache HelloWorld-Anwendung in NetBeans 8.1. Es muss einfach funktionieren: Sobald es kompiliert und ausgeführt wird, lädt es alle Daten einer Tabelle acc in den Datenbankkonten mit MySQL.So beheben Sie "nicht gemeldete Ausnahme InstantiierungException; muss abgefangen oder als geworfen erklärt werden"

Ich habe die JAR-Datei Connector/J in meine Projektbibliothek aufgenommen und eine Verbindung zu MySQL hergestellt, aber die Klasse.forName (com.mysql.jdbc.Driver) .newInstance(); Zeile in Code-Stück zeigt "nicht gemeldete Ausnahme InstantiationException; muss gefangen oder deklariert werden geworfen werden" und ich weiß genau nicht, was zu tun ist. Ich stecke hier irgendwie fest.

Hier ist mein Code

package learning_jdbc; 

import java.sql.*; 

public class Hello { 
    Connection connection; 
    private void displaySQLErrors(SQLException e) { 
     System.out.println("SQLException: " + e.getMessage()); 
     System.out.println("SQLState: " + e.getSQLState()); 
     System.out.println("VendorError: " + e.getErrorCode()); 
    } 

    public Hello() { 
     try { 
      Class.forName("com.mysql.jdbc.Driver").newInstance(); 
     } catch (ClassNotFoundException e) { 
      System.out.println("Class not found."); 
     } 
    } 

    public void connectToDB() { 
     try { 
      connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/accounts","root","thejoker"); 
     } catch(SQLException e) { 
      displaySQLErrors(e); 
     } 
    } 

    public void executeSQL() { 
     try (Statement statement = connection.createStatement(); 
        ResultSet rs = statement.executeQuery("SELECT * FROM acc")) { 
      while (rs.next()) { 
       System.out.println(rs.getString(1)); 
      } 
      connection.close(); 
     } catch(SQLException e) { 
      displaySQLErrors(e); 
     } 
    } 

    public static void main(String[] args) { 
     Hello hello = new Hello(); 
     hello.connectToDB(); 
     hello.executeSQL(); 
    } 

} 
+2

Was denken Sie, dass Fehlermeldung bedeutet? Könnten Sie es anders formulieren? Hier ist mein Versuch: "Sie müssen InstantiationException abfangen. Oder Sie müssen deklarieren, dass es ausgelöst werden kann." Lesen Sie http://docs.oracle.com/javase/tutorial/essential/exceptions/. Es ist wichtig, dass Sie verstehen, was diese Nachricht bedeutet und wie Ausnahmen funktionieren. Beachten Sie jedoch, dass diese Codezeile nicht erforderlich sein sollte. –

Antwort

2

Wenn Sie .newInstance() nennen, der Konstruktor die aufgerufen wird, stellt etwas Ausnahme werfen könnte. Da dies über Reflektion erfolgt und somit nicht bekannt ist, ob dieser Konstruktor eine geprüfte Ausnahme auslöst, löst der reflektive Aufruf .newInstance() trotzdem eine geprüfte Exception aus, und Sie müssen den Fall behandeln, dass der Konstruktor eine Exception geworfen hat.

Aber warum machst du überhaupt einen .newInstance() Anruf? Soweit ich mich erinnere, sollte ein Class.forName ausreichen, da dann die Klasse geladen wird und der statische Initialisierer die Klasse im DriverManager registriert.

1

bitte mit jave 7 und und oben Sie brauchen nicht einmal, dass call.You vollständig Class.forName("com.mysql.jdbc.Driver").newInstance();

entfernen
1

Sie nie den newInstance() Teil benötigt, und Sie haben nicht den Class.forName() Teil benötigt, da JDBC 4 im Jahr 2007 erschien.

Entfernen Sie es einfach.

Es gibt jedoch nichts in Ihrer Frage, die durch einen guten Blick auf den Javadoc für Class.newInstance() nicht gelöst werden konnte. Überprüfte Ausnahmen müssen irgendwie behandelt werden.

+0

Soweit ich weiß, gab es einen Anwendungsfall für den Aufruf von 'newInstance()' mit einem sehr alten MySQL - Treiber (Anfang 2000s (?)), Der einen Fehler hatte, bei dem die Treiberregistrierung in einem statischen Initializer nicht erfolgte JDBC-Spezifikation, aber in einem Instanzinitialisierer. Sie mussten also 'newInstance()' aufrufen, um es zu registrieren. Dieser Fehler wurde jedoch seit Jahren (Jahrzehnten) behoben. –

Verwandte Themen