如何将 PrepareStatement 点修复为空?

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)


元芳怎么了
浏览 179回答 2
2回答

翻阅古今

“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。即使没有例外。

慕丝7291255

您需要在 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;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java