java - 如何修复 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)
解决方案
“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 版本中。
- 对于旧版本的 MySQL 连接器/J 驱动程序,名称为
我还想指出,您的很多问题都归因于一些实现错误:
- 你不应该抓住
Exception
。仅捕获您知道如何处理的异常。 - 您通常不应该
printStackTrace()
在异常处理程序中使用。应记录异常。对打印堆栈跟踪的分散调用使得维护生产代码变得更加困难。 - 您不应将方法声明为
throws Exception
. 这意味着调用者必须能够处理所有异常,并且几乎不知道会发生什么。 null
如果出现错误,返回通常是个坏主意。要么让异常传播到可以有效处理的地方,要么将其包装在不同的异常中并抛出它。
目前发生的是方法中的任何错误getConnection
都会导致它返回null
。并且调用的代码getConnnection
没有正确处理这个问题......导致NullPointerException
. 所以,你有一个问题,你现在有两个。
最后,如果您仔细查看您的代码,您会发现有一个错误导致它总是返回null
。即使没有例外。
推荐阅读
- aws-sdk-go - 使用 jsencrypt 加密,然后使用 aws-sdk-go 解密
- javascript - 如何使用 WHERE 子句中的下拉值查询数据库
- python-3.x - Telegram Bot 没有这样的文件或目录
- css - Float + break-word 在 safari 中不起作用
- java - 在SpringBoot项目中,我写了一些代码将文件上传到另一个ftp服务器但失败了
- python - 如何将一键通添加到语音识别
- haskell - 在依赖类型的函数式编程语言中扁平化列表更容易吗?
- python - 如何在另一个方法仍在运行时调用一个方法 - Python
- python - matplotlib line2d 设置数据在图像上显示时非常慢
- mysql - 如何将子查询与 Laravel 查询构建器中的列进行比较?