我正在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();
}
}
答案 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的良好审视来解决。必须以某种方式处理已检查的异常。