【问题标题】:NullPointer exception when connecting to a mySQL database in Java EE在 Java EE 中连接到 mySQL 数据库时出现 NullPointer 异常
【发布时间】:2014-05-25 01:54:39
【问题描述】:

我正在尝试从一个 serverlet 连接到一个 mySql 数据库,但是当我尝试这样做时,我得到一个空指针异常:

连接:

try {
        Class.forName("com.mysql.jdbc.Driver");
        connection = DriverManager.getConnection(
                "jdbc:mysql://localhost/bmistore", "bmiuser",
                "yMMECajG99yE4YWE");
    } catch (Exception e) {
        System.out.println("No DB found");
        connection = null;
    }
}

用法:

public List<String> getAllNames() {
    System.out.println("Test");
    List<String> names = new ArrayList<>();

    try {
        Statement statement = connection.createStatement();
        ResultSet results = statement
                .executeQuery("SELECT name FROM patients");

        System.out.println("TEST 2");

        //Add all names to array
        while (results.next()) {
            String name = results.getString("name");
            names.add(name);
        }
    } catch (SQLException e) {
        System.out.println("getAllNames: " + e.getMessage());
    }

    return names;

我在名为 RemoteSystemsTempFiles 的文件夹中有一个 .sql 文件。我不确定为什么会出现,因为我使用的是讲师提供的示例。感谢您的时间。

异常堆栈跟踪:

May 25, 2014 11:38:09 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [Main] in context with path [/BMISystem] threw       exception
java.lang.NullPointerException
at PatientManager.getAllNames(PatientManager.java:42)
at Main.doGet(Main.java:48)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at     org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.jav        a:305)
at   org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
  at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

【问题讨论】:

  • 如果您发布完整的异常堆栈跟踪会很有帮助
  • 在 getAllNames() 方法本身中添加连接代码并检查是否工作..
  • 再观察一下,还要参数化 Arraylist。 List&lt;String&gt; names = new ArrayList&lt;String&gt;();
  • 什么是 PatientManager.getAllNames(PatientManager.java:42) 行?
  • 也放PatientManager类的代码

标签: java mysql jakarta-ee


【解决方案1】:

确保PatientManager 在该行中不为空。

【讨论】:

    【解决方案2】:

    在使用 PatientManager 之前进行空检查

    if(PatientManager != null){
         PatientManager.getAllNames();
    }
    

    【讨论】:

      【解决方案3】:

      我打赌连接是空的。您将连接包装在 try catch 块中,但如果抛出异常,则连接被设置为 null。

      稍后你使用连接而不检查它是否有效:Statement statement = connection.createStatement();

      我的建议是在使用前检查连接:

      public List<String> getAllNames() {
          System.out.println("Test");
          List<String> names = new ArrayList<>();
      
          if (connection == null) {
               // do something here: return the empty collection or throw an exception.
          }
          try {
              Statement statement = connection.createStatement();
              ResultSet results = statement
                      .executeQuery("SELECT name FROM patients");
      
              System.out.println("TEST 2");
      
              //Add all names to array
              while (results.next()) {
                  String name = results.getString("name");
                  names.add(name);
              }
          } catch (SQLException e) {
              System.out.println("getAllNames: " + e.getMessage());
          }
      
          return names;
      

      【讨论】:

        【解决方案4】:

        堆栈跟踪显示at PatientManager.getAllNames(PatientManager.java:42)

        这意味着 PatientManager 值为空。了解它是如何设置为 null 的。

        【讨论】:

        • 什么?不,不是那个意思。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-14
        • 1970-01-01
        • 1970-01-01
        • 2019-03-23
        • 2019-06-02
        • 2013-04-19
        相关资源
        最近更新 更多