无法调用“java.sql.Connection.prepareStatement(String)”,因为“dbConnection”为null(Mysql连接)

r8uurelv  于 2023-03-28  发布在  Mysql
关注(0)|答案(2)|浏览(606)

我得到这个错误无法调用“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();
    }
 
}

有一个相关的问题在这里,但那个人有一个不同的问题比我。谢谢你的帮助:)

euoag5mw

euoag5mw1#

你有 * 可怕的 * 异常处理,这是这个问题的根源。
处理异常的最好方法是直接抛出它,特别是如果异常是方法抛出的,而不是基于它的实现,而是仅仅基于它的规范(所以,它的名字,它的参数类型,和它的javadoc)。一个名为createConnection的方法,在一个名为DbConnection的类中,显然应该声明为throws SQLException。因此,修复createConnection方法;它应该是:

private Connection createConnection() throws SQLException {
    Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);
    System.out.println("Connected to Database.");
    return connection;
}

看看它有多干净。
如果这是不可能的(因为你正在重写一个方法,因此无法添加任何检查的异常,或者异常是由于一个实现细节,不应该被暴露),那么下一个最好的方法是将它作为一个不同的异常重新抛出:

private Connection createConnection() {
    try {
        Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);
        System.out.println("Connected to Database.");
        return connection;
    } catch (SQLException e) {
        throw new RuntimeException("Cannot connect to database", e);
    }
}

需要明确的是,这是一个糟糕的设计,这个方法应该被声明为抛出SQLException,这是与数据库交互的基本部分。
你现在做的事情比这糟糕多了
首先,它导致了这个问题。主要的问题是双重的:
1.你扔掉了很多有用的信息。那个e对象有一个堆栈跟踪,一个类型,一条消息,原因等等。通过捕获它,然后只是打印一些东西到syserr并继续,你已经把所有这些有用的信息都扔到垃圾箱里了。
1.通过继续执行代码,您的应用现在处于您从未预料到的状态(在本例中,Connection connection;为null,因此返回null。这会导致两个子问题:
2a.实际问题现在发生在一个不相关的地方:问题是您的'连接到DB'调用正在失败,但是由于您的异常处理程序,现在一个与此无关的行(即试图使用空引用的行)出现了问题
2b. '堆栈跟踪爆炸' -因为代码继续,但应用程序处于您未预料到的状态,* 显然 * 应用程序很快就会抛出某种异常。如果您所有的异常处理代码都是这样的,那也会被吞噬并导致一些System.out流量,结果是,1个问题导致100个堆栈跟踪被转储到sysout,除了第一个,它们都是完全不相关的
最后一点发生在你身上。这里有一个简单的规则:

除非你真的要处理异常或者从catch块中重新抛出异常或者其他异常,否则你绝对不能捕获异常。System.err在它们中是不被调用的

jdzmm42g

jdzmm42g2#

我也遇到过类似的问题。我所要做的就是更新我的pom.xml文件,将postgresql作为一个依赖项包含进来--但前提是你使用的是maven作为你的项目管理工具。见下文。

<dependencies>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.5.4</version>
    </dependency>
</dependencies>

版本可能随时间而不同。
希望能有所帮助

相关问题