【问题标题】:How to fix "unreported exception InstantiationException; must be caught or declared to be thrown" [duplicate]如何修复“未报告的异常 InstantiationException;必须被捕获或声明为抛出”[重复]
【发布时间】:2016-04-30 13:22:42
【问题描述】:

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

我已经在我的项目库中包含了 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();
    }

}

【问题讨论】:

  • 您认为该错误消息是什么意思?你能改写一下吗?这是我的尝试:“您必须捕获 InstantiationException。或者您必须声明它可以被抛出。”。阅读docs.oracle.com/javase/tutorial/essential/exceptions。了解此消息的含义以及异常的工作原理很重要,但请注意,这行代码不是必需的。

标签: java mysql jdbc connector-j


【解决方案1】:

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

但是你为什么要打一个.newInstance() 电话呢?据我所知,Class.forName 应该足够了,因为该类已加载,其静态初始化程序将在 DriverManager 中注册该类。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      自 2007 年 JDBC 4 出现以来,您从来不需要 newInstance() 部分,并且您不需要 Class.forName() 部分。

      删除它。

      但是,仔细查看Class.newInstance() 的Javadoc,您的问题中没有什么是无法解决的。必须以某种方式处理已检查的异常。

      【讨论】:

      • 据我所知,有一个用例是使用非常旧的 MySQL 驱动程序(从 2000 年代开始(?))调用 newInstance(),该驱动程序存在一个错误,即驱动程序注册没有在静态中发生JDBC 规范要求的初始化程序,但在实例初始化程序中。所以你必须打电话给newInstance() 让它注册。不过,这个错误已经修复了多年(几十年;)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      相关资源
      最近更新 更多