Как исправить "незарегистрированное исключение InstantiationException; должно быть перехвачено или объявлено как выброшенное"

Я создаю простое приложение HelloWorld в NetBeans 8.1. Он должен работать просто, при этом, как только он скомпилируется и запустится, он загрузит все данные таблицы в учетные записи базы данных, используя MySQL.

Я включил jar-файл Connector/J в библиотеку моего проекта и установил соединение с 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();
    }

}

3 ответа

Решение

Если вы позвоните .newInstance()вызываемый конструктор может вызвать какое-то исключение. Поскольку это происходит с помощью отражения, и, следовательно, неизвестно, создает ли этот конструктор проверенное исключение или нет, отражающий .newInstance() Вызов call выдает проверенное исключение в любом случае, и вам приходится обрабатывать случай, когда конструктор может выдать исключение.

Но почему ты делаешь .newInstance() звонить вообще? Насколько я помню Class.forName должно быть достаточно, так как тогда класс загружается и его статический инициализатор зарегистрирует класс в DriverManager,

Пожалуйста с jave 7 и выше вам даже не нужен этот звонок. Вы можете полностью удалить Class.forName("com.mysql.jdbc.Driver").newInstance();

Вы никогда не нуждались в newInstance() часть, и вам не нужно Class.forName() часть с момента появления JDBC 4 в 2007 году.

Просто удали это.

Однако в вашем вопросе нет ничего, что нельзя было бы решить, посмотрев на Javadoc для Class.newInstance(), Проверенные исключения должны быть как-то обработаны.

Другие вопросы по тегам