2016-04-30 4 views
0

NetBeans 8.1で単純なHelloWorldアプリケーションを構築しています。 コンパイルして実行するとすぐに、MySQLを使用してテーブルaccのすべてのデータをデータベースアカウントにロードします。「報告されていない例外InstantiationException;をキャッチするか、スローする必要がある」を修正する方法

私はプロジェクトライブラリにConnector/J jarファイルを含め、MySQLに接続しましたが、Class.forName(com.mysql.jdbc.Driver).newInstance();に接続しました。コードの一部が「報告されていない例外InstantiationException;がキャッチされるかスローされると宣言されている」と表示され、何をすべきか正確には分かりません。私はここにこだわっています。ここで

は私のコードは、あなたが.newInstance()を呼び出すと、呼び出されたコンストラクタは、いくつかの例外をスローする可能性

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

エラーメッセージは何を意味しますか?あなたはそれを言い換えることができますか?ここに私の試みがあります: "あなたはInstantiationExceptionをキャッチする必要がありますか、それともスローされることを宣言する必要があります。" http://docs.oracle.com/javase/tutorial/essential/exceptions/を参照してください。このメッセージの意味と例外の仕組みを理解することが重要ですが、このコード行は必要ではないことに注意してください。 –

答えて

2

です。これは反映されているため、そのコンストラクタがチェック例外をスローするかどうかはわかりませんが、反射型の.newInstance()コールではチェックされた例外がスローされ、コンストラクタが例外をスローするケースを処理する必要があります。

なぜ、.newInstance()コールを行うのですか?私が覚えている限り、Class.forNameは、クラスがロードされ、その静的初期化子がクラスをDriverManagerに登録するのに十分であるはずです。

1

jave 7でくださいと、あなたはさえcall.Youが完全Class.forName("com.mysql.jdbc.Driver").newInstance();

1

を削除することができますあなたはnewInstance()一部を必要としたことがない、とJDBC 4が2007年に登場以来、あなたはClass.forName()一部を必要としていないことを必要といけない以上。

ただ削除してください。

しかし、Class.newInstance()のJavadocをよく見ても解決できなかったことは何もありません。チェックされた例外は何らかの形で処理する必要があります。

+0

私が知っている限り、非常に古いMySQLドライバ(2000年代(?))で 'newInstance()'を呼び出すユースケースがありました。このドライバは、ドライバの登録が静的イニシャライザでは発生しませんでした。 JDBC仕様ですが、インスタンスイニシャライザで使用します。だから、それを登録するには 'newInstance()'を呼び出さなければなりませんでした。このバグは数年前から修正されています。 –