JSP java.lang.NullPointerException移动服务器时

时间:2016-02-23 14:11:33

标签: java mysql jsp

我知道有很多关于这个错误的帖子,但我的情况是

  • 网站在一台服务器(旧主机)上工作
  • 网站不再适用于新服务器(已安装和运行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' 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没有?

3 个答案:

答案 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()