在Servlet中获得了NullPointerException

问题描述 投票:0回答:1

**我创建了一个基本的servlet程序,如果用户正确输入USN编号,它将从数据库中获取数据,否则它将重定向到error.html。每当我输入USN数字时,它就会显示NullPointerException。由于我使用的是Eclipse,所以没有错误迹象。注意:我还创建了一个html文件来输入USN编号。

代码:

package com.abc.error;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class GetResult extends HttpServlet {
 /**
 * 
 */
 static final long serialVersionUID = 1L;
 Connection con= null;
 PreparedStatement pstmt=null;
 ResultSet res=null;
 public void init(){
        try {
            Class.forName("oracle.jdbc.OracleDriver");
            con = DriverManager.getConnection("jdbc:oracle:thin:@//localhost:1521/XE","system","system");
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }

@Override
public void service(HttpServletRequest request, HttpServletResponse response) {
    try
    {   
        pstmt = con.prepareStatement("SELECT * FROM VTURESULT_AUG WHERE USN =?");
        String key = request.getParameter("USN");
        if(key.length()!=12){
            response.sendRedirect("/ServletWithError/error.html");
        }
        else
        {
            pstmt.setString(1,key);
            res =pstmt.executeQuery();
            if(res.next())
            {
                String usn = res.getString(1);
                String name = res.getString(2);
                int m1 = res.getInt(3);
                int m2 = res.getInt(4);
                int m3 = res.getInt(5);
                PrintWriter pw =response.getWriter();
                pw.println(usn+" "+name+" "+m1+" "+m2+" "+m3);
            }
        }
    }
    catch(SQLException | IOException e)
    {
        e.printStackTrace();
    }
  }
}

输出:

java.lang.NullPointerException
com.abc.error.GetResult.service(GetResult.java:36)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
java servlets
1个回答
0
投票
如果已发布代码的行号与您的实际代码匹配,则堆栈跟踪表示NPE在此行:

pstmt.setString(1,key);

您可以通过在该行上设置断点来验证这一点。

我看不到您的实际代码,因此需要使用更多断点检查几件事:

  1. con是否为空?如果是这样,则可能不会调用您的init()方法,或者它在日志中向上方抛出了一个您没有看到的异常。
  2. 将您的PreparedStatement声明下移到使用它的地方-在这种情况下,在函数外声明它根本对您没有帮助:

    PreparedStatement stmt = con.prepare(...);

  3. 当然,请确认key不为空。
© www.soinside.com 2019 - 2024. All rights reserved.