我有一个有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)
我的servlet:
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) {
}
}
答案 0 :(得分:0)
问题出在ProcessReg
的第86行,您试图在对象上调用方法,但是您对该对象的引用== null
,因此NullPointerException
。
找到该引用,并确定控制流中该点的null
是否为错误。如果是错误,请修复此问题。如果它不是错误,请等到您将其设置为指向对象,然后再使用它来调用该对象上的方法。
的更新强> 的
现在您已经发布了DBConnection的代码,很明显您的代码存在许多问题。我将尝试指出主要的,但作为一个旁边,我认真地建议刷新Java基础here,然后再编写相对复杂的功能,如Servlets等。
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");
答案 1 :(得分:0)
问题是public static Connection getConnection()
方法返回一个空连接,因为你永远不会调用实际加载驱动程序并创建连接对象的createConnection()
。在getConnection()
课程中返回createConnection()
对象之前,您需要先修复con
以致电DBConnect
。
答案 2 :(得分:0)
检查null
:
if (stmt != null) {
rs = stmt.executeQuery("SELECT * FROM members");
}
但你的代码看起来很奇怪。
您调用DBConnect类的静态方法:
DBConnect.getConnection();
那你为什么要创建这个类的对象?
DBConnect a = new DBConnect();
为什么将getConnection()
方法的返回值设置为Statement
类型的变量?
stmt = (Statement) DBConnect.getConnection();
您将其投放到Statement
的目的是什么?仅当您的方法返回Object
引用类型时才需要它。如果返回类型是子接口或Statement
的任何实现,则无需进行强制转换。并且无法执行Connection
到Statement
的投射。
方法DBConnect.createConnection()
不使用参数。他们是硬编码的。
如果尚未调用方法或发生异常,静态字段con
将保持null
。