我得到这个错误无法调用“java.sql.Connection.prepareStatement(String)”因为“dbConnection”是null
在com.claim.classes.Connection.selectRecordsFromTable(Connection.java:24)在com.claim.classes.Connection.main(Connection.java:12)
看看我的代码,一切看起来都是正确的,所以我不知道为什么我得到这个错误。
连接.java
package com.claim.classes;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Connection {
public static void main(String args[])throws Exception{
selectRecordsFromTable();
}
private static void selectRecordsFromTable() throws SQLException {
Connection dbConnection = null;
PreparedStatement preparedStatement = null;
String selectSQL = "SELECT * FROM USER WHERE id = ?";
try {
dbConnection = (Connection) DbConnection.getConnection();
preparedStatement = ((java.sql.Connection) dbConnection).prepareStatement(selectSQL);
preparedStatement.setInt(1, 16);
// execute select SQL statement
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
int id = rs.getInt("id");
String email = rs.getString("email");
String fname = rs.getString("first_name");
String lname = rs.getString("lanst_name");
//Display values
System.out.print("\nID: " + id +"\nEmail: " + email+ "\nfirst name: " + fname+"\nlast Name: " + lname);
}
} catch (SQLException e) {
System.out.println(e.getMessage());
} finally {
if (preparedStatement != null) {
preparedStatement.close();
}
if (dbConnection != null) {
((Statement) dbConnection).close();
}
}
}
}
DbConnection.java
package com.claim.classes;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DbConnection{
// public Connection conn;
//static reference to itself
private static DbConnection instance = new DbConnection();
public static final String URL = "jdbc:mysql://localhost:3306/root";
public static final String USER = "root";
public static final String PASSWORD = "root";
public static final String DRIVER_CLASS = "com.mysql.cj.jdbc.Driver";
//private constructor
private DbConnection() {
try {
Class.forName(DRIVER_CLASS);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private Connection createConnection() {
Connection connection = null;
try {
connection = DriverManager.getConnection(URL, USER, PASSWORD);
System.out.println("Connected to Database.");
} catch (SQLException e) {
System.out.println("ERROR: Unable to Connect to Database.");
}
return connection;
}
public static Connection getConnection() {
return instance.createConnection();
}
}
有一个相关的问题在这里,但那个人有一个不同的问题比我。谢谢你的帮助:)
2条答案
按热度按时间euoag5mw1#
你有 * 可怕的 * 异常处理,这是这个问题的根源。
处理异常的最好方法是直接抛出它,特别是如果异常是方法抛出的,而不是基于它的实现,而是仅仅基于它的规范(所以,它的名字,它的参数类型,和它的javadoc)。一个名为
createConnection
的方法,在一个名为DbConnection
的类中,显然应该声明为throws SQLException
。因此,修复createConnection方法;它应该是:看看它有多干净。
如果这是不可能的(因为你正在重写一个方法,因此无法添加任何检查的异常,或者异常是由于一个实现细节,不应该被暴露),那么下一个最好的方法是将它作为一个不同的异常重新抛出:
需要明确的是,这是一个糟糕的设计,这个方法应该被声明为抛出SQLException,这是与数据库交互的基本部分。
你现在做的事情比这糟糕多了
首先,它导致了这个问题。主要的问题是双重的:
1.你扔掉了很多有用的信息。那个
e
对象有一个堆栈跟踪,一个类型,一条消息,原因等等。通过捕获它,然后只是打印一些东西到syserr并继续,你已经把所有这些有用的信息都扔到垃圾箱里了。1.通过继续执行代码,您的应用现在处于您从未预料到的状态(在本例中,
Connection connection;
为null,因此返回null。这会导致两个子问题:2a.实际问题现在发生在一个不相关的地方:问题是您的'连接到DB'调用正在失败,但是由于您的异常处理程序,现在一个与此无关的行(即试图使用空引用的行)出现了问题
2b. '堆栈跟踪爆炸' -因为代码继续,但应用程序处于您未预料到的状态,* 显然 * 应用程序很快就会抛出某种异常。如果您所有的异常处理代码都是这样的,那也会被吞噬并导致一些
System.out
流量,结果是,1个问题导致100个堆栈跟踪被转储到sysout,除了第一个,它们都是完全不相关的。最后一点发生在你身上。这里有一个简单的规则:
除非你真的要处理异常或者从catch块中重新抛出异常或者其他异常,否则你绝对不能捕获异常。System.err在它们中是不被调用的。
jdzmm42g2#
我也遇到过类似的问题。我所要做的就是更新我的pom.xml文件,将postgresql作为一个依赖项包含进来--但前提是你使用的是maven作为你的项目管理工具。见下文。
版本可能随时间而不同。
希望能有所帮助