我在2个程序包中分别具有JDBC类和Servlet类。 我尝试从HTML表单中获取数据并将其插入表中。 这是用于获取数据的Servlet类代码
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String userName = request.getParameter("UserName");
String password = request.getParameter("Password");
String country = request.getParameter("Country");
String address = request.getParameter("Address");
String gender = request.getParameter("Gender");
String years = request.getParameter("Years");
String bDate = request.getParameter("BirthDate");
Boolean hasCar = null;
if (request.getParameter("Car")!= null){
hasCar = true;
}else{
hasCar = false;
}
这是JDBC类中的插入数据的方法
public static void insertData(User user){
String sql = "insert into users values (1,?,?,?,?,?,?,?,?)";
PreparedStatement ps = null;
String userName = user.getUserName();
String password = user.getPassword();
String address = user.getAddress();
String country = user.getCountry();
String gender = user.getGender();
int years = Integer.parseInt(user.getYears());
String bbd = user.getBDate();
Date bDate = null;
try {
bDate = (Date) new SimpleDateFormat("dd/MM/yyyy").parse(bbd);
} catch (ParseException e) {
e.printStackTrace();
}
boolean hasCar = user.isHasCar();
try {
ps.setString(1, userName);
ps.setString(2, password);
ps.setString(3, country);
ps.setString(4, address);
ps.setString(5, gender);
ps.setInt(6, years);
ps.setDate(7, bDate);
ps.setBoolean(8, hasCar);
ps = conn.prepareStatement(sql);
ps.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
}
我从Servlet类的类用户创建了一个对象,并将其传递给JDBC方法并重定向到另一个html页面
User user = new User(userName, password, country, address, gender, years, bDate, hasCar);
JDBCClass.insertData(user);
response.sendRedirect("Home.html");
但是它抛出java.lang.nullpointerexception
怎么了?
答案 0 :(得分:0)
在代码中定义PreparedStatement ps = null;
并先调用ps.setString()
然后初始化它,这就是导致NullPointerException的原因,您需要在使用它之前先对其进行初始化
ps = conn.prepareStatement(sql);//need to init it now
ps.setString(1, userName);
ps.setString(2, password);
ps.setString(3, country);
ps.setString(4, address);
ps.setString(5, gender);
ps.setInt(6, years);
ps.setDate(7, bDate);
ps.setBoolean(8, hasCar);
//ps = conn.prepareStatement(sql);//this is the wrong place
ps.executeUpdate(sql);
此外,在插入数据时省略列名是非常糟糕的做法
String sql = "insert into users values (1,?,?,?,?,?,?,?,?)"; //it's bad,since you omit the column name
String sql = "insert into users (col1,col2,col3,col4,col5,col6,col7,col8,col9)
values (1,?,?,?,?,?,?,?,?)";
答案 1 :(得分:0)
回答您的问题:
您声明PreparedStatement ps = null;
,然后在ps.setString(int,String)
仍为ps
的情况下尝试执行方法null
。
在将表单值分配给适当的位置索引之前,应该先“准备”语句。
如果将ps = conn.prepareStatement(sql);
移到值分配之前,则它应该起作用。像这样:
boolean hasCar = user.isHasCar();
try {
ps = conn.prepareStatement(sql);
ps.setString(1, userName);
ps.setString(2, password);
ps.setString(3, country);
ps.setString(4, address);
ps.setString(5, gender);
ps.setInt(6, years);
ps.setDate(7, bDate);
ps.setBoolean(8, hasCar);
ps.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
}
评论:
我想指出的是,将变量分配为null会使您的代码更容易出现我们在此处观察到的那些类型的错误。