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)
答案 0 :(得分:2)
“ com.mysql.jdbc.Driver”而不是“ com.mysql.cj.jdbc.Driver”,但这似乎无关紧要。
这很可能是相关的。但是根据您的报告,这并不是完整的解决方案。
真正的问题是以下一个或两个:
您可能为JDBC驱动程序使用了错误的类名:
com.mysql.jdbc.Driver
。com.mysql.cj.jdbc.Driver
我还要指出,您的许多问题都归因于某些实现错误:
Exception
。仅捕获您知道如何处理的异常。printStackTrace()
。异常应记录。对打印堆栈跟踪的分散调用使维护生产代码变得更加困难。 throws Exception
。这意味着调用者必须能够处理所有所有异常,并且几乎不知道会发生什么。null
是一个坏主意。让异常传播到可以有效地进行处理的地方,或者将其包装在其他异常中,然后抛出该异常。此刻发生的是getConnection
方法中的任何错误都导致它返回null
。并且调用getConnnection
的代码无法正确处理此问题……导致NullPointerException
。因此,在您遇到一个问题的地方,现在有两个。
最后,如果仔细看一下代码,您会发现存在一个错误,导致该错误总是返回null
。即使没有例外。
答案 1 :(得分:-2)
您需要在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;
}