如何修复 "unreported exception InstantiationException; must be caught or declared to be thrown"
How to fix "unreported exception InstantiationException; must be caught or declared to be thrown"
我正在 NetBeans 8.1 中构建一个简单的 HelloWorld 应用程序。
它必须工作简单,其中一旦编译和 运行 它将使用 MySQL.
加载数据库帐户中 table acc 的所有数据
我已将 Connector/J jar 文件包含在我的项目库中并与 MySQL 建立了连接,但 Class.forName(com.mysql.jdbc.Driver).newInstance();一段代码中的行显示 "unreported exception InstantiationException; must be caught or declared to be thrown",我完全不知道该怎么做。我有点卡在这里了。
这是我的代码
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();
}
}
如果您调用 .newInstance()
,被调用的构造函数可能会抛出一些异常。由于这是通过反射进行的,因此不知道该构造函数是否抛出已检查异常,反射 .newInstance()
调用无论如何都会抛出已检查异常,您必须处理构造函数可能抛出异常的情况。
但是你为什么要打 .newInstance()
电话呢?据我所知, Class.forName
应该足够了,然后加载 class 并且它的静态初始化程序将在 DriverManager
.
中注册 class
请使用 Java 7 及更高版本,您甚至不需要 call.You 可以完全删除 Class.forName("com.mysql.jdbc.Driver").newInstance();
您从来不需要 newInstance()
部分,并且自从 JDBC 4 于 2007 年出现以来您就不需要 Class.forName()
部分。
只需删除它。
但是,仔细查看 Class.newInstance()
的 Javadoc,您的问题中没有任何内容是无法解决的。必须以某种方式处理已检查的异常。
我正在 NetBeans 8.1 中构建一个简单的 HelloWorld 应用程序。 它必须工作简单,其中一旦编译和 运行 它将使用 MySQL.
加载数据库帐户中 table acc 的所有数据我已将 Connector/J jar 文件包含在我的项目库中并与 MySQL 建立了连接,但 Class.forName(com.mysql.jdbc.Driver).newInstance();一段代码中的行显示 "unreported exception InstantiationException; must be caught or declared to be thrown",我完全不知道该怎么做。我有点卡在这里了。
这是我的代码
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();
}
}
如果您调用 .newInstance()
,被调用的构造函数可能会抛出一些异常。由于这是通过反射进行的,因此不知道该构造函数是否抛出已检查异常,反射 .newInstance()
调用无论如何都会抛出已检查异常,您必须处理构造函数可能抛出异常的情况。
但是你为什么要打 .newInstance()
电话呢?据我所知, Class.forName
应该足够了,然后加载 class 并且它的静态初始化程序将在 DriverManager
.
请使用 Java 7 及更高版本,您甚至不需要 call.You 可以完全删除 Class.forName("com.mysql.jdbc.Driver").newInstance();
您从来不需要 newInstance()
部分,并且自从 JDBC 4 于 2007 年出现以来您就不需要 Class.forName()
部分。
只需删除它。
但是,仔细查看 Class.newInstance()
的 Javadoc,您的问题中没有任何内容是无法解决的。必须以某种方式处理已检查的异常。