2016-04-30 59 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现在已经修复了数年(数十年)。 –

相关问题