如何将PrepareStatement点固定为null?

时间:2019-05-17 00:29:16

标签: java

prepare语句以某种方式指向null,我看不出有合理的原因。我试图了解什么是错误的,为什么它指向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)

2 个答案:

答案 0 :(得分:2)

  

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

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

真正的问题是以下一个或两个:

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

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

我还要指出,您的许多问题都归因于某些实现错误:

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

此刻发生的是getConnection方法中的任何错误都导致它返回null。并且调用getConnnection的代码无法正确处理此问题……导致NullPointerException。因此,在您遇到一个问题的地方,现在有两个。


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

答案 1 :(得分:-2)

您需要在try块中返回连接。

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();
        return con;
    }
    catch(Exception ex){
        System.out.println("Error: " + ex);
    }
    return null;
}