2016-04-30 109 views
0

我在NetBeans 8.1中構建了一個簡單的HelloWorld應用程序。 它的工作很簡單,只要它編譯並運行,它就會使用MySQL加載數據庫賬戶中表acc的所有數據。如何解決「未報告的異常InstantiationException;必須被捕獲或聲明爲拋出」

我已將Connector/J jar文件包含在我的項目庫中,並建立了與MySQL的連接,但是Class.forName(com.mysql.jdbc.Driver).newInstance();在一段代碼行顯示「未報告的異常InstantiationException;必須被捕獲或聲明被拋出」,我完全不知道該怎麼做。我有點卡在這裏。

這裏是我的代碼

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

請與java的7及以上的,你甚至不需要一個call.You能徹底清除Class.forName("com.mysql.jdbc.Driver").newInstance();

1

你永遠需要newInstance()的一部分,你有沒有需要Class.forName()部分,因爲JDBC 4出現在2007年。

只要刪除它。

但是,在您的問題中沒有任何東西可以通過查看Javadoc的Class.newInstance()來解決。檢查異常必須以某種方式處理。

+0

據我所知,有一個用戶調用'newInstance()'用一個非常古老的MySQL驅動程序(從2000s(?)開始),該驅動程序有一個錯誤,驅動程序註冊沒有出現在靜態初始化程序中JDBC規範,但在一個實例初始化器中。所以你必須調用'newInstance()'來註冊它。不過,這個bug現在已經修復了數年(數十年)。 –

相關問題