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

标签 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”实用程序继承并在旧服务器上运行。引用的 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/

相关文章:

php - 当涉及到where语句时,如何从多个表中进行选择。

java - 在 INSERT 语句之后选择?

javascript - 如何在JSP字符串变量中插入JavaScript变量

java - 在服务器上运行但在 devbox 上不运行的 spring mvc 应用程序出现 404 错误

java - JSP 页面是/否对话框

java - Android - 在电容式触摸屏上检测触摸压力?

java - 如何让 IntelliJ 在调试器中显示未使用的变量

java - 如何使按钮在不同的点击量上发生变化java

php - MySQL SUM 与分组日期

java - 如何将 Firebase Admin SDK 与存储结合使用