Java 如何将PrepareStatement点固定为null?

Java 如何将PrepareStatement点固定为null?,java,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

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)

您需要在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;
}
“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;
    }
}
这很可能是相关的。但根据你的报告,这并不是一个完整的解决方案

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

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

    • 对于MySQL连接器/J驱动程序的旧版本,名称为
      com.MySQL.jdbc.Driver
    • 对于较新版本,它是
      com.mysql.cj.jdbc.Driver
    • 这一变化发生在8.0版本中
我还要指出,你们的许多问题都是由于一些实施错误造成的:

  • 您不应该捕获异常。只捕获您知道如何处理的异常
  • 通常不应在异常处理程序中使用
    printStackTrace()
    。应记录例外情况。分散打印stacktraces的调用使得维护生产代码变得更加困难
  • 您不应该将方法声明为
    抛出异常
    。这意味着调用方必须能够处理所有异常,并且不知道会发生什么
  • 如果出现错误,返回
    null
    通常是一个坏主意。要么让异常传播到可以有效处理它的地方,要么将其包装在不同的异常中并抛出该异常
此时发生的情况是
getConnection
方法中的任何错误都会导致它返回
null
。调用
getconnection
的代码没有正确处理此问题。。。导致
NullPointerException
。所以你有一个问题,现在有两个



最后,如果仔细查看代码,您会发现有一个bug导致它总是返回
null
。即使没有异常。

@Nathanhughs我的类路径中有它即使驱动程序在类路径中,您总是从
getConnection
返回
null
。哪一行是26?@targetman我应该返回什么而不是?@Clay-您不应该返回任何内容。您应该让异常传播。。。处理这些问题的水平更高。另外,捕获异常或声明一个方法来抛出异常也是一个非常糟糕的主意。捕获所有异常并返回null是一个糟糕的选择。将方法声明为
会引发异常
是错误的选择。将OP的错误选择复制到解决方案中是错误的选择。