如何修复"未报告的异常InstantiationException;必须被抓住或宣布被抛出"

时间:2016-04-30 13:22:43

标签: java mysql jdbc connector-j

我正在NetBeans 8.1中构建一个简单的HelloWorld应用程序。 它必须工作简单,只要它将编译并运行它将使用MySQL加载数据库帐户中的表acc的所有数据。

我已将Connector / J jar文件包含在我的项目库中并建立了与MySQL的连接,但是Class.forName(com.mysql.jdbc.Driver).newInstance();代码段中的行显示"未报告的异常InstantiationException;必须被抓住或宣布被扔掉#34;而且我完全不知道该怎么做。我有点被困在这里。

这是我的代码

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();
    }

}

3 个答案:

答案 0 :(得分:2)

如果你调用.newInstance(),被调用的构造函数可能会抛出一些异常。由于这是通过反射,因此不知道该构造函数是否抛出已检查的异常,反射.newInstance()调用无论如何都会抛出一个已检查的异常,您必须处理构造函数可能引发异常的情况。 / p>

但你为什么要做.newInstance()电话呢?据我所知,Class.forName应该足够了,然后加载类,其静态初始值设定项将在DriverManager中注册该类。

答案 1 :(得分:1)

请使用jave 7及以上版本,你甚至不需要那个电话。你可以完全删除Class.forName("com.mysql.jdbc.Driver").newInstance();

答案 2 :(得分:1)

你永远不需要newInstance()部分,自从JDBC 4出现在2007年以来,你还没有Class.forName()部分。

删除它。

然而,你的问题中没有任何内容可以通过对Class.newInstance()的Javadoc的良好审视来解决。必须以某种方式处理已检查的异常。