首页 > 解决方案 > 如何修复 PrepareStatement 点为空?

问题描述

Prepare 语句以某种方式指向 null ,我看不到它的合理原因。我试图了解出了什么问题,所以为什么它指向空值。我曾尝试使用“com.mysql.jdbc.Driver”而不是“com.mysql.cj.jdbc.Driver”,但这似乎无关紧要。

public class Main {

    public static void main(String args[]) throws Exception {
        saveData();
    }

    public static void saveData() throws Exception{

        Car Ford = new Car();

        Ford.setType("Car");
        Ford.setModel("Ford");
        Ford.setColour("Black");
        Ford.setSunroof(true);
        Ford.setDoor(4);

        String query = "INSERT INTO sys.homework(ID,type,colour,sunroof,model,door)VALUES(?,?,?,?,?,?)";

        try{
            Connection con = getConnection();

            PreparedStatement ps = con.prepareStatement(query); //Debugger points this line

            ps.setInt(1,12);
            ps.setString(2, Ford.getType());
            ps.setString(3,Ford.getColour());
            ps.setBoolean(4,Ford.isSunroof());
            ps.setString(5, Ford.getModel());
            ps.setInt(6, Ford.getDoor());

            ps.executeUpdate();
        }
        catch (SQLException sql) {
            sql.printStackTrace();
        }
    }

    public static Connection getConnection() throws Exception {
        try{
            Class.forName("com.mysql.cj.jdbc.Driver");
            Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sys?useUnicode=true&usetetimeCode=false&serverTimezone=Germany","root","pass");
            Statement st = con.createStatement();
        }
        catch(Exception ex){
            System.out.println("Error: " + ex);
        }
        return null;
    }
}

这是错误消息:

Error: java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver
Exception in thread "main" java.lang.NullPointerException
    at sample.Main.saveData(Main.java:26)

标签: java

解决方案


“com.mysql.jdbc.Driver”而不是“com.mysql.cj.jdbc.Driver”,但这似乎无关紧要。

这很可能是相关的。但是根据您的报告,这不是完整的解决方案。

真正的问题是以下一项或两项

  • 包含 JDBC 驱动程序的 JAR 文件可能不在类路径中。
  • 您可能为 JDBC 驱动程序使用了错误的类名:

    • 对于旧版本的 MySQL 连接器/J 驱动程序,名称为com.mysql.jdbc.Driver.
    • 对于较新的版本,它是com.mysql.cj.jdbc.Driver
    • 更改发生在 8.0 版本中。

我还想指出,您的很多问题都归因于一些实现错误:

  • 你不应该抓住Exception。仅捕获您知道如何处理的异常。
  • 您通常不应该printStackTrace()在异常处理程序中使用。应记录异常。对打印堆栈跟踪的分散调用使得维护生产代码变得更加困难。
  • 您不应将方法声明为throws Exception. 这意味着调用者必须能够处理所有异常,并且几乎不知道会发生什么。
  • null如果出现错误,返回通常是个坏主意。要么让异常传播到可以有效处理的地方,要么将其包装在不同的异常中并抛出它。

目前发生的是方法中的任何错误getConnection都会导致它返回null。并且调用的代码getConnnection没有正确处理这个问题......导致NullPointerException. 所以,你有一个问题,你现在有两个。


最后,如果您仔细查看您的代码,您会发现有一个错误导致它总是返回null。即使没有例外。


推荐阅读