0

我有一个带有 doPost 的表单:

<form id="frmData" name="frmData" action="ProcessReg" method="post">            
  <td>Full Name</td>
  <td><input type="text" id="stFullName" name="stFullName" value=""></td>

我收到 HTTP 500 错误,并且 Tomcat 日志将命中request.getParameter部分的行指示为问题。

java.lang.NullPointerException
ProcessReg.processRequest(ProcessReg.java:86)
ProcessReg.doPost(ProcessReg.java:32)
javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

我的小服务程序:

public class ProcessReg extends HttpServlet {

  protected void doGet(HttpServletRequest request, HttpServletResponse response)   
     throws ServletException, IOException {
    processRequest(request, response);
  }

  protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    processRequest(request, response);
  }

  protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();

    PreparedStatement ps = null;
    Connection con = null;
    ResultSet rs = null;
    Statement stmt = null;

    String strName = "";

   strName = request.getParameter("stFullName");

   try {
     DBConnect a = new DBConnect();
     stmt = (Statement) DBConnect.getConnection();                   
     rs = stmt.executeQuery("SELECT * FROM members");

我希望有人能在它完美运行之前告诉我出了什么问题,我真的迷失了错误在哪里。

完整的堆栈跟踪:

SEVERE: Servlet.service() for servlet [ProcessReg] in context with path [/Web1] threw  exception
    java.lang.NullPointerException
at ProcessReg.processRequest(ProcessReg.java:86)
at ProcessReg.doPost(ProcessReg.java:32)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at     org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)

还有我的 DBConnect.java :

  public class DBConnect {

  private static Connection con;

  public static void createConnection(String dbUrl,String dbusername,String      dbPassword){
    try {
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        con = DriverManager.getConnection("jdbc:odbc:practODBC, 231, abc");     
    } catch (Exception ex) {
    }    
}

    public static Connection getConnection(){
    return con;
}

   public static void closeConnection(){
    if(con!=null){
        try {
            con.close();
        } catch (SQLException ex) {
        }
    }
4

3 回答 3

0

问题是public static Connection getConnection()方法返回一个空连接,因为您从不调用createConnection()实际加载驱动程序并创建连接对象的方法。在类中返回对象之前,您需要修复您getConnection()的调用。createConnection()conDBConnect

于 2013-09-22T15:30:44.627 回答
0

检查null

if (stmt != null) {
    rs = stmt.executeQuery("SELECT * FROM members");
}

但是你的代码看起来很奇怪。

  1. 您调用 DBConnect 类的静态方法:

    DBConnect.getConnection();
    

    那你为什么要创建这个类的对象呢?

    DBConnect a = new DBConnect();
    
  2. 为什么将getConnection()方法的返回值设置为类型变量Statement

    stmt = (Statement) DBConnect.getConnection();
    
  3. 您将其投射到什么目的StatementObject仅当您的方法返回引用类型时才需要它。如果返回类型是子接口或Statement. 并且无法执行Connectionto的转换。Statement

  4. 方法DBConnect.createConnection()不使用采用的参数。它们是硬编码的。

  5. 如果方法没有被调用或发生异常,静态字段con将保留。null

于 2013-09-22T15:47:51.580 回答
0

问题出在第 86 行,ProcessReg您试图调用对象上的方法,但是您必须对该对象的引用 == null,因此NullPointerException.

找到那个引用,并确定它null在控制流中的那个点是否是一个错误。如果是错误,请修复它。如果它不是错误,请等到您将它设置为指向一个对象,然后再使用它来调用该对象上的方法。

更新

现在您已经发布了 DBConnection 的代码,很明显您的代码存在许多问题。我会尝试指出主要的,但顺便说一句,我强烈建议在这里复习 Java 基础知识,然后再继续编写相对复杂的功能,如 Servlet 等。

中的问题ProcessReg

你正在调用getConnection()和返回con,但你还没有初始化con,所以你只是返回一个null引用。

然后,您尝试将Connection返回的引用getConnection()转换为Statement类型。这将抛出一个ClassCastException. 相反,您需要调用createStatement()返回的Connection对象引用。

上的所有方法DbConnect都是静态的(见下文 - 你应该重构它)所以你正在实例化一个毫无意义的 DBConnect 对象a,然后显然永远不会使用它。

中的问题DBConnect

你有一个静态字段con,以及修改/访问它的静态方法。不要这样做。创建con一个实例变量并将初始化放入 DBConnect 构造函数中 - 如下所示:

public class DBConnect {

    private Connection con;

    public DBConnect() {
        // setup con
    }

    public Connection getConnection() {
        return con; // con is never null because it's been initialised in constructor
    }

    ...

然后,在 中ProcessReg,实例化一个DBConnect对象,并Connection通过调用 来获取它包装的对象getConnection(),类似于:

PreparedStatement ps = null;
Connection con = null;
ResultSet rs = null;
Statement stmt = null;

String strName = "";

strName = request.getParameter("stFullName");

try {
     DBConnect dbConnect = new DBConnect();
     con = dbConnect.getConnection();
     stmt = con.createStatement();                   
     rs = stmt.executeQuery("SELECT * FROM members");
于 2013-09-22T11:02:27.093 回答