我知道有很多关于这个错误的帖子,但我的情况是
我们启动并运行了一个数据库,并创建了一个 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' util继承并在旧服务器上工作。引用的 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]这是我最实用的脚本
<!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没有?
答案 0 :(得分:0)
检查tomcat lib文件夹并比较两个位置。我的猜测是现有的一个有一个jdbc驱动程序jar,最新的一个没有。
答案 1 :(得分:0)
看起来我需要编辑.class
文件并使用正确的连接详细信息重新编译它。不是Java / JSP编码器我没有意识到这一点。
但是通过这样做,我的NullPointerException已经消失了。现在全新的情况,但我正在向前迈进。谢谢你的帮助,两个人!
答案 2 :(得分:0)
您正在通过检查getSt().close();
的{{1}}值来结束语句null
。
这就是为什么当Statement未初始化时它将抛出NPE。
您的if(con!=null){
方法应该是:
dbStConClose()
此代码将防止间歇性NPE(取决于Statement的初始化)和正确关闭DB资源。
编辑:还有一件事,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);
}
}
中应该有一个编译错误,因为您要为Statement和Connection引用分配空白字符,以防万一例外,这是错误的。如果您无法获得连接,那么代码应抛出异常(更好的SQLException),说明无法获得连接。在数据库的情况下,使用null或空值初始化不是解决方案,其余取决于您的选择。
dbConnection()