**我创建了一个基本的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)
pstmt.setString(1,key);
您可以通过在该行上设置断点来验证这一点。我看不到您的实际代码,因此需要使用更多断点检查几件事:
con
是否为空?如果是这样,则可能不会调用您的init()
方法,或者它在日志中向上方抛出了一个您没有看到的异常。- 将您的PreparedStatement声明下移到使用它的地方-在这种情况下,在函数外声明它根本对您没有帮助:
PreparedStatement stmt = con.prepare(...);
- 当然,请确认
key
不为空。