【问题标题】:Null.Pointer.Exception in my web app我的网络应用程序中的 Null.Pointer.Exception
【发布时间】:2012-02-28 14:37:55
【问题描述】:

我正在尝试创建一个 Web 应用程序,该应用程序正在查询我的 oracle 数据库并从表中返回菜单标题列表,但是当我导航到该页面时,它会抛出如下所示的区域。

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: java.lang.NullPointerException
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:502)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:430)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

root cause

java.lang.NullPointerException
oracle.DatabaseConnector.selectAllMenus(DatabaseConnector.java:63)
org.apache.jsp.menus_jsp._jspService(menus_jsp.java:113)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.35 logs.

以下是我的 java 类中查询数据库的代码的违规部分。但我不确定为什么这会导致上述错误?有人可以看看有没有问题?

public MenuList selectAllMenus(String ordering) {
    MenuList list = null;

    try {
        String strQuery = "SELECT title"
                + " FROM menus"
                + " ORDER BY " + ordering;
        PreparedStatement stmt = conn.prepareStatement(strQuery);

        results = stmt.executeQuery();

        list = new MenuList(results);
    } catch (SQLException e) {
        e.printStackTrace();
    }

    return list;
}

这是日志文件中的内容:

28-Feb-2012 14:40:57 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException
at oracle.DatabaseConnector.selectAllMenus(DatabaseConnector.java:63)
at org.apache.jsp.menus_jsp._jspService(menus_jsp.java:113)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:877)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:594)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1675)
at java.lang.Thread.run(Thread.java:662)

【问题讨论】:

  • 哪一行正好在DatabaseConnector.java:63
  • 有问题的行是 PreparedStatement stmt = conn.prepareStatement(strQuery);
  • 啊.. 那么正如@vulkanio 所说,它必须是你的conn,此时它为空。也正如他所说,为Exception e 设置一个catch 块并执行e.printStackTrace() 将有助于更正确地理解错误。
  • 我建议阅读一些不错的 JDBC 教程。您管理数据库资源的方式是错误的。
  • 另外添加results.close();stmt.close()ResultSet results = ...;。 @BalusC 的意思很好。确保 MenuList 构造函数立即复制值。

标签: java jsp jdbc nullpointerexception


【解决方案1】:

希望您使用的是 MySQL DB..

确保将正确的 MySQL Java 连接器添加为外部库,并将 Tomcat 添加为外部服务器(在 Eclipse 中项目的构建路径中)。

(您也可以将 $TOMCAT_HOME/$CATALINA_HOME 的 lib 文件夹中的所有库复制到构建路径。

这应该可以解决这个问题。

谢谢。

【讨论】:

    【解决方案2】:

    您可以查看您的日志:Apache Tomcat/6.0.35 logs

    但错误信息本身很清楚:数据库连接为空,可能您的连接字符串/参数不正确。

    【讨论】:

      【解决方案3】:

      我假设conn 已打开。

      您为什么不打印错误消息而不是打印堆栈跟踪?

      【讨论】:

      • printStackTrace 确实包含该消息。系统生成的NullPointerExceptions 没有消息——第一个堆栈跟踪行号是您的信息来源。
      【解决方案4】:

      行:

      PreparedStatement stmt = conn.prepareStatement(strQuery);
      

      “conn”没有在任何地方创建

      尝试这样的方法来创建连接:

      public class MyConnection {
      Connection conn;
      String username;
      String password;
      public Connection getConnection(){
          try {
              String url = "jdbc:mysql://localhost/yourDBName?";
              Class.forName("com.mysql.jdbc.Driver");
              try {
                  conn = (Connection) DriverManager.getConnection(url,username,password);
              } catch (Exception e) {
              System.out.println(e);
              }
      
          } catch (SQLException e) {
              System.out.println(e);
          }
          return conn;
      }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2013-01-26
        • 2012-02-03
        • 2018-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-23
        • 2014-03-02
        • 1970-01-01
        相关资源
        最近更新 更多