插入oracle数据库时发生NullPointerException

时间:2018-09-19 10:46:28

标签: java nullpointerexception

我在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

怎么了?

Error photo

2 个答案:

答案 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会使您的代码更容易出现我们在此处观察到的那些类型的错误。