Java 如何将PrepareStatement点固定为null?
Prepare语句以某种方式指向null,我看不出它的合理原因。我试图理解什么是错误的,为什么它指向null。我曾尝试使用“com.mysql.jdbc.Driver”而不是“com.mysql.cj.jdbc.Driver”,但这似乎无关紧要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
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版本中
- 对于MySQL连接器/J驱动程序的旧版本,名称为
- 您不应该捕获异常。只捕获您知道如何处理的异常
- 通常不应在异常处理程序中使用
。应记录例外情况。分散打印stacktraces的调用使得维护生产代码变得更加困难李>printStackTrace()
- 您不应该将方法声明为
。这意味着调用方必须能够处理所有异常,并且不知道会发生什么抛出异常
- 如果出现错误,返回
通常是一个坏主意。要么让异常传播到可以有效处理它的地方,要么将其包装在不同的异常中并抛出该异常null
getConnection
方法中的任何错误都会导致它返回null
。调用getconnection
的代码没有正确处理此问题。。。导致NullPointerException
。所以你有一个问题,现在有两个
最后,如果仔细查看代码,您会发现有一个bug导致它总是返回
null
。即使没有异常。@Nathanhughs我的类路径中有它即使驱动程序在类路径中,您总是从getConnection
返回null
。哪一行是26?@targetman我应该返回什么而不是?@Clay-您不应该返回任何内容。您应该让异常传播。。。处理这些问题的水平更高。另外,捕获异常或声明一个方法来抛出异常也是一个非常糟糕的主意。捕获所有异常并返回null是一个糟糕的选择。将方法声明为会引发异常
是错误的选择。将OP的错误选择复制到解决方案中是错误的选择。