【问题标题】:java.lang.NullPointerException error while executing SQL query inside try catch block在 try catch 块中执行 SQL 查询时出现 java.lang.NullPointerException 错误
【发布时间】:2013-09-28 19:29:11
【问题描述】:

运行程序时出现java.lang.NullPointerException 错误。似乎错误似乎在 try 块内: rs = st.executeQuery(query); 下面的Java代码中的方法regcustomers。请检查我的代码并帮助我了解我做错了什么。

import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.vastika.serlvet.dao.ConnectionDb;

public class RegistrationServlet extends HttpServlet {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
        // Read the data
        String name = req.getParameter("name");
        String email = req.getParameter("email");
        String line1 = req.getParameter("addressline1");
        String city = req.getParameter("city");
        String state = req.getParameter("state");
        String country = req.getParameter("country");
        String userid = req.getParameter("username");
        String password = req.getParameter("password");
        insertToDatabase(name, email, line1, city, state, country, userid,
                password);
        // Forward to Shopping page
        req.getRequestDispatcher("shop.html").forward(req, res);
    }

    private void insertToDatabase(String name, String email, String line1,
            String city, String state, String country, String userid,
            String password) {

        ConnectionDb con = new ConnectionDb();
        Statement st = con.makeConnection();
        ResultSet rs = null;
        String query = "insert into regcustomers (Name, Email, Address, City, State, Country, Username, Password) values("+"'"+name+"'"+","+"'"+email+"'"+","+"'"+line1+"'"+","+"'"+city+"'"+","+"'"+state+"'"+","+"'"+country+"'"+","+"'"+userid+"'"+","+"'"+password+"'"+");";

        System.out.println(query);

        try {
            rs = st.executeQuery(query);
            System.out.println(rs.getRow());
            } 
        catch (SQLException e) {
            e.printStackTrace();        
            }

    }
}

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class ConnectionDb {
    public Statement makeConnection() {
        Connection conn = null;
        Statement st = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/onlineshopping", "root",
                    "test");
            st = conn.createStatement();
        } catch (Exception e) {
            e.getStackTrace();
        }
        return st;
    }
}

【问题讨论】:

  • con.makeConnection() 是做什么的?
  • 你的 con.makeConnection() 在做什么?如果可能,请发布所有相关代码。
  • 并确保异常归咎于您认为有问题的行。添加异常会很好(并指出线条)。
  • 注意:SQL 表应该始终是单数的。您应该将regcustomers 更改为regcustomer
  • 快速评论:关于参数化参数的研究。您的代码似乎容易受到 sql 注入的影响。

标签: java mysql exception-handling nullpointerexception try-catch


【解决方案1】:

发生的情况是您在以下代码中遇到异常

public Statement makeConnection() {
    Connection conn = null;
    Statement st = null;
    try {
        Class.forName("com.mysql.jdbc.Driver");
        conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/onlineshopping", "root",
                "test");
        st = conn.createStatement();
    } catch (Exception e) {
        e.getStackTrace();
    }
    return st;
}

然后返回st,即null,因为代码从未到达conn.createStatement()

顺便说一句,您实际上并没有打印Exception。使用e.printStackTrace()

您还应该实际处理异常。

【讨论】:

  • 我使用 e.printStackTrace() 打印了异常,但它仍然无法正常工作。似乎代码工作正常,直到它到达 try 块内的点 (rs = st.executeQuery(query); 这意味着 makeConnection 似乎正在工作。但还不确定是什么导致它出现空指针异常。跨度>
  • 我的回答解释了这一点,因为您的makeConnection() 正在返回null。它显示了什么异常?
  • 这是控制台出现的样子:
  • 严重:servlet [RegistrationServlet] 的 Servlet.service() 在路径 [/OnlineShopping] 的上下文中在 com.vastika.servlets.RegistrationServlet.insertToDatabase(RegistrationServlet.java: 51)
  • @prince2369 那是 NPE。 makeConnection() 捕获的异常说明了什么?
【解决方案2】:

不用分号;

String query = "insert into regcustomers (Name, Email, Address, City, State, Country, Username, Password) values("+"'"+name+"'"+","+"'"+email+"'"+","+"'"+line1+"'"+","+"'"+city+"'"+","+"'"+state+"'"+","+"'"+country+"'"+","+"'"+userid+"'"+","+"'"+password+"'"+")";

当您点击 SELECT 查询时,它会返回 ResultSet

删除 ResultSet 声明..

Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/DATABASENAME", "root", "");
Statement st = con.createStatement();

使用int count = st.executeUpdate();

【讨论】:

    【解决方案3】:

    在 try catch 块中执行 SQL 查询时触发 java.lang.NullPointerException 错误的情况很奇怪。 该查询更新了几个 JComboboxes 中的选定索引。 这些 JComboboxes 最初链接到根据 shema 手动更新索引:

    private void PriorityLoad6ActionPerformed(java.awt.event.ActionEvent evt) {                                              
            // TODO add your handling code here:
            NewSelectedIndex = PriorityLoad6.getSelectedIndex(); SetNewIndexes();
        } 
    

    在这种情况下,当用简单的方式执行mysql更新时

    PriorityLoad6.setSelectedIndex(rs.getInt("PriorityLoad_6"));
    

    触发了上述错误。 在这种情况下,一种解决方案是使用在查询期间不活动的 if 来“隔离”内部代码。例如:

    private void PriorityLoad6ActionPerformed(java.awt.event.ActionEvent evt) {                                              
                    if (SaveSettings.hasFocus() == false){NewSelectedIndex = PriorityLoad6.getSelectedIndex(); SetNewIndexes();}}
    

    这个动作之前当然应该有适当的放置:

    SaveSettings.requestFocus();
    

    在调用 mysql 查询之前。

    【讨论】:

      【解决方案4】:

      你可以试试这个:

      private void insertToDatabase(String name, String email, String line1,
                  String city, String state, String country, String userid,
                  String password) {
      
              ConnectionDb con = new ConnectionDb();
              Statement st = con.makeConnection();
              ResultSet rs = null;
              String query = "insert into regcustomers (Name, Email, Address, City, State, Country, Username, Password) values(?,?,?,?,?,?,?,?)";
              st.setString(1,name);
              st.setString(2,email);
              st.setString(3,line1);
              st.setString(4,street);
              st.setString(5,state);
              st.setString(6,country);
              st.setString(7,userid);
              st.setString(8,passwoname);
      
              try {
                  int flag = st.executeUpdate(query);
                  } 
              catch (SQLException e) {
                  e.printStackTrace();        
                  }
      
          }
      

      我认为您想做的不是查询,而是更新。所以而不是:

      rs = st.executeQuery(query);
      

      你可以这样做:

      int flag = st.executeUpdate(query);
      

      请参阅this 了解更多信息。

      Att:你有一个 NullPointer 异常,因为(可能)rs = st.executeQuery(query); 什么也没得到。

      希望对你有帮助^^

      【讨论】:

      • 我不能使用 setString,因为它对于 Statement 类型是未定义的。对此有什么想法吗?
      • 对不起,你可以用Statment代替PreparedStatement
      • @Cold executeQuery(query) 永远不会返回 null,因此不会导致 NullPointerException。 link参考
      猜你喜欢
      • 2016-11-11
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      • 2011-12-03
      • 2018-09-02
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      相关资源
      最近更新 更多