Tomcat上的Java NullPointException
我正在用jsp和servlet开发注册系统,当我在本地tun时,我不会得到NullPointerException。但当我将它部署到远程服务器时,我得到了这个NullPointerException 我的代码中有错误吗Tomcat上的Java NullPointException,java,mysql,sql,servlets,jdbc,Java,Mysql,Sql,Servlets,Jdbc,我正在用jsp和servlet开发注册系统,当我在本地tun时,我不会得到NullPointerException。但当我将它部署到远程服务器时,我得到了这个NullPointerException 我的代码中有错误吗 package com.app.base; //imported necessary packages. removes for readability. public class RegisterServlet extends HttpServlet { @Overrid
package com.app.base;
//imported necessary packages. removes for readability.
public class RegisterServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
PrintWriter out = null;
// Connection connection = null;
// Statement statement;
// ResultSet rs;
resp.setContentType("text/html");
out = resp.getWriter();
String fname = req.getParameter("fname");
String lname = req.getParameter("lname");
String email = req.getParameter("email");
String password = req.getParameter("password");
String city = req.getParameter("city");
String country = req.getParameter("country");
Connection connection = null;
try {
// Load the JDBC driver
Class.forName("com.mysql.jdbc.Driver");
// Create a connection to the database
connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306,/main",
"root", "root");
} catch (SQLException ex) {
resp.sendRedirect("index.jsp?error=SQLError");
} catch (ClassNotFoundException e) {
resp.sendRedirect("index.jsp?error=Class Not Found");
}
PreparedStatement statement;
try {
statement = connection
.prepareStatement("INSERT INTO main.users(first_name, last_name, email, password, "
+ "city, country, registered_time)VALUES(?,?,?,?,?,?, NOW())");
statement.setString(1, fname);
statement.setString(2, lname);
statement.setString(3, email);
statement.setString(4, password);
statement.setString(5, city);
statement.setString(6, country);
int rs = statement.executeUpdate();
if (rs == 1) {
resp.sendRedirect("index.jsp?registered=true");
// String destination = "index.jsp?registered=true";
// RequestDispatcher rd =
// getServletContext().getRequestDispatcher(destination);
// rd.forward(req, resp);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
resp.sendRedirect("index.jsp?registered=false");
}
}
}
堆栈跟踪:
SEVERE: Servlet.service() for servlet [Register] in context with path [] threw exception
java.lang.NullPointerException
at com.app.base.RegisterServlet.doPost(RegisterServlet.java:79)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:306)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:322)
at org.apache.tomcat.util.net.AprEndpoint$SocketWithOptionsProcessor.run(AprEndpoint.java:1688)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
在所有情况下都找不到驱动程序类,这意味着调用
class.forName()
会引发ClassNotFoundException
。你发送了一个重定向(顺便说一句,没有记录异常,这不是一个好主意,你现在已经可以看到你很难找到错误),但你没有从你的呼叫返回。将连接保留为null
,并在稍后尝试调用prepareStatement
时导致代码中出现NPE
添加一个返回代码>发送重定向以停止呼叫后
当然,你应该想方设法在你的Tomcat上使用这个驱动程序。你错误地在字符串中添加了额外的
connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306,/main",
"root", "root");
注意,/main
应该是这样
connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/main",
"root", "root");
很抱歉,如果这不是正确答案,我不是上述所有人的专家当您将数据库部署到远程服务器上时,是否确定您的数据库在localhost:3306上运行?请查看堆栈跟踪的第一行:位于com.app.base.RegisterServlet.doPost(RegisterServlet.java:79)
。第79行有什么?能否打印RegisterServlet.java79行是statement=connection.prepareStatement(“插入到main.users(名字、姓氏、电子邮件、密码,“+”城市、国家、注册时间)值(?,,,,,,,,,,,NOW());嗯,我把它改成了localhost,所以我没有在这里发布我的mysql url、用户名和密码。你认为Connection=null;中的错误吗;?但是如果它为null,为什么在执行SQL时会出现错误?不,您必须初始化连接。但问题是,当您调用Class.forName()时,它实际上会抛出ClassNotFoundException,因此您直接进入catch块,发送重定向,然后继续处理调用。当您到达prepareStatement时,连接仍然为空。好的,有什么解决方案?如果删除连接初始化并使用connection connection=DriverManager.getConnection(“jdbc:mysql://localhost:3306主、根、根);在try块内部?是和否。如果您将有关语句准备的所有代码也带到try/catch块中,那么它将起作用。但毕竟,您的主要问题实际上是类加载器找不到您的驱动程序类。您可能应该发布另一个问题,询问如何在webapp类路径上获取驱动程序类