我知道有很多关于此错误的线程,但我的情况是
- 网站在一台服务器(旧主机)上运行
- 网站不再在新服务器上运行(已安装并运行 TomCat)
我们已经启动并运行了一个数据库,我创建了一个 conntest.do 文件以确保我们可以连接到该数据库。但是,当我们运行主页(即没有发布表单数据等)时,会产生以下错误:
exception
javax.servlet.ServletException: java.lang.NullPointerException
org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:535)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:433)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
com.ntech.realjosh.util.GenericFilter.doFilter(GenericFilter.java:86)
root cause
java.lang.NullPointerException
com.ntech.realjosh.util.DbUtil.dbStConClose(DbUtil.java:46)
com.ntech.realjosh.util.RealjoshUtil.chkUserLock(RealjoshUtil.java:1378)
com.ntech.realjosh.action.IndexAction.execute(IndexAction.java:25)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
com.ntech.realjosh.util.GenericFilter.doFilter(GenericFilter.java:86)
“RealJosh”实用程序继承并在旧服务器上运行。引用的 DBUtil 是相同的,只是 mysql 访问详细信息已更新。
问题是作为一家托管公司,我们内部没有 JSP 程序员,但客户无法让他们的网站在我们的服务器上运行。
我们将非常感激您能提供的任何帮助。如果我需要发布任何 .java 文件的内容,请告诉我。 谢谢,
马丁
[编辑] 这是完整的 DBUtil.java 文件:
public class DbUtil {
private Connection con;
private Statement st;
private ResultSet rs;
public void dbConnection() {
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/youngrob_database", "youngrob_user", "password");
st = con.createStatement();
Logger.getLogger(DbUtil.class.getName()).log(Level.INFO, "Db Connected..........");
} catch (Exception ex) {
Logger.getLogger(DbUtil.class.getName()).log(Level.SEVERE, null, ex);
st = '';
con = '';
}
}
public void dbClose() {
try {
if(getRs()!=null){
getRs().close();
}
getSt().close();
getCon().close();
setRs(null);
setSt(null);
setCon(null);
} catch (SQLException ex) {
Logger.getLogger(DbUtil.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void dbStConClose() {
try {
if(con!=null){
getSt().close();
getCon().close();
//setSt(null);
//setCon(null);
}
} catch (SQLException ex) {
Logger.getLogger(DbUtil.class.getName()).log(Level.SEVERE, null, ex);
}
}
public Connection getCon() {
return con;
}
public void setCon(Connection con) {
this.con = con;
}
public ResultSet getRs() {
return rs;
}
public void setRs(ResultSet rs) {
this.rs = rs;
}
public Statement getSt() {
return st;
}
public void setSt(Statement st) {
this.st = st;
}
}
[编辑2]这是我的conntest脚本,它确实有效
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@ page import="java.sql.*" %>
<%@ page import="java.io.*" %>
<html>
<head>
<title>Connection with mysql database</title>
</head>
<body>
<h1>Connection status </h1>
<%
try {
/* Create string of connection url within specified format with machine name,
port number and database name. Here machine name id localhost and
database name is usermaster. */
String connectionURL = "jdbc:mysql://localhost:3306/youngrob_database";
// declare a connection by using Connection interface
Connection connection = null;
// Load JBBC driver "com.mysql.jdbc.Driver"
Class.forName("com.mysql.jdbc.Driver").newInstance();
/* Create a connection by using getConnection() method that takes parameters of
string type connection url, user name and password to connect to database. */
connection = DriverManager.getConnection(connectionURL, "youngrob_user", "password");
// check weather connection is established or not by isClosed() method
if(!connection.isClosed())
%>
<font size="+3" color="green"></b>
<%
out.println("Successfully connected to " + "MySQL server using TCP/IP...");
connection.close();
}
catch(Exception ex){
%>
</font>
<font size="+3" color="red"></b>
<%
out.println("Unable to connect to database.");
}
%>
</font>
</body>
</html>
我的问题似乎是我的 conntest 创建了有效的 mysql 连接,但我的 DBUtil.java 没有?
最佳答案
您将通过检查 if(con!=null){
的 null
值来关闭语句 getSt().close();
。
这就是为什么在Statement未初始化时会抛出NPE。
你的dbStConClose()
方法应该是这样的:
public void dbStConClose() {
try {
if(getSt()!=null){
getSt().close();
}
} catch (SQLException ex) {
Logger.getLogger(DbUtil.class.getName()).log(Level.SEVERE, null, ex);
}
try {
if(getCon()!=null){
getCon().close();
}
} catch (SQLException ex) {
Logger.getLogger(DbUtil.class.getName()).log(Level.SEVERE, null, ex);
}
}
此代码将防止间歇性 NPE(这取决于 Statement 的初始化)并正确关闭数据库资源。
编辑:还有一件事,dbConnection()
中应该有一个编译错误,因为您将空白字符分配给语句并且连接引用,如果出现异常,这是错误的。如果您无法获得连接,那么代码应该抛出异常(更好的 SQLException),指出无法获得连接。对于数据库来说,使用 null 或空值初始化并不是解决方案,剩下的取决于您的选择。
public void dbConnection() {
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/youngrob_database", "youngrob_user", "password");
st = con.createStatement();
Logger.getLogger(DbUtil.class.getName()).log(Level.INFO, "Db Connected..........");
} catch (Exception ex) {
Logger.getLogger(DbUtil.class.getName()).log(Level.SEVERE, null, ex);
// st = '';
// con = '';
// throw new SQLException("Failed to get DB Connection");
// if you can not throw checked exception then
throw new RuntimeException("Failed to get DB Connection");
}
}
关于java - 移动服务器时 JSP java.lang.NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35579794/