为了账号安全,请及时绑定邮箱和手机立即绑定

如何将 PrepareStatement 点修复为空?

如何将 PrepareStatement 点修复为空?

元芳怎么了 2022-11-30 17:01:20
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.DriverException in thread "main" java.lang.NullPointerException    at sample.Main.saveData(Main.java:26)
查看完整描述

2 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

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


查看完整回答
反对 回复 2022-11-30
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

您需要在 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;

}


查看完整回答
反对 回复 2022-11-30
  • 2 回答
  • 0 关注
  • 150 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号