【问题标题】:Potential null pointer access. The variable may be null at this location. java.lang.NullPointerException [duplicate]潜在的空指针访问。该变量在此位置可能为空。 java.lang.NullPointerException [重复]
【发布时间】:2017-09-11 18:24:56
【问题描述】:

我知道关于这个错误有很多类似的主题,但我尝试了一些建议,但我的问题仍然没有得到解决。 我正在关注本教程:https://www.youtube.com/watch?v=B3gEbC37DAM&list=PL1A506B159E5BD13E&index=2

这是我的代码:

public class JdbcDaoImpl {    
  public Circle getCircle(final int circleId) {
    Connection conn = null;

    try {
        String driver = "org.apache.derby.jdbc.ClientDriver";
        Class.forName(driver).newInstance();
        conn = DriverManager.getConnection("jdbc:derby//localhost:1527//db");
        PreparedStatement ps = conn.prepareStatement("SELECT * FROM circle where id= ?");
        ps.setInt(1, circleId);

        Circle circle = null;
        ResultSet rs = ps.executeQuery();
        if (rs.next()) {
            circle = new Circle(circleId, rs.getString("name"));
        }
        rs.close();
        ps.close();
        return circle;
    } catch (Exception e) {
        throw new RuntimeException(e);

    } finally {
        try {
            conn.close();

        } catch (SQLException e) {
        }

    }
  }
}

在“conn.close();”上它说:潜在的空指针访问。该变量在此位置可能为空。 当我运行程序时出现此错误:线程“main”java.lang.NullPointerException中的异常

我尝试了我在类似主题上看到的解决方案:

if(conn!=null){
    conn.close();
}

但我仍然有错误。

提前感谢您的帮助!

【问题讨论】:

  • 还有哪些错误?
  • 您在输入if 语句时遇到什么错误?
  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建 minimal reproducible example。使用“编辑”链接改进您的问题 - 不要通过 cmets 添加更多信息。谢谢!

标签: java nullpointerexception


【解决方案1】:

Finally Block 总是在你使用 try catch 时执行,你可以得到一个潜在的NullPointerException 是当conn = DriverManager.getConnection("jdbc:derby//localhost:1527//db"); throws NullPointerException 被你的catch (Exception e) 捕获,然后 finally 块开始被执行你在哪里做conn.close(),但你的conn对象是NULL,它再次抛出NullPointerException,它没有被捕获,因为你正在捕获catch (SQLException e)

【讨论】:

    【解决方案2】:

    假设您使用的是 Java >= 1.6,则无需显式加载驱动程序 (Class.forName)。

    您可以使用 try-with-resources 来管理 AutoCloseable 对象(ConnectionPreparedStatementResultSet),因此您的代码可以编写为:

    public Circle getCircle(final int circleId) {
        try (Connection conn = DriverManager.getConnection("jdbc:derby//localhost:1527//db");
             PreparedStatement ps = conn.prepareStatement("SELECT * FROM circle where id= ?")){
          ps.setInt(1, circleId);
    
          Circle circle = null;
          try (ResultSet rs = ps.executeQuery()) {
            if (rs.next()) {
              circle = new Circle(circleId, rs.getString("name"));
            }
          }
          return circle;
        } catch (Exception e) {
          throw new RuntimeException(e);
        }
      }
    

    这也保证了所有资源都被正确关闭,从而解决了很多由于资源泄漏而可能出现的问题。

    问题在于 getConnection 可能会抛出异常,将 conn 保留为 null,这会在您稍后尝试在 finally 块中关闭它时导致一个空指针。

    【讨论】:

      【解决方案3】:

      conn 可以为空的原因很简单。如果在conn之前执行的代码被赋值,即在这段代码运行成功之前:

      String driver = "org.apache.derby.jdbc.ClientDriver";
      Class.forName(driver).newInstance();
      conn = DriverManager.getConnection("jdbc:derby//localhost:1527//db");
      

      此代码必须成功运行才能使 conn 不为空,因此您需要在对其调用 close() 之前进行非空检查。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-17
        • 2014-04-10
        • 1970-01-01
        • 2011-06-22
        • 2018-10-06
        • 2016-06-16
        • 1970-01-01
        相关资源
        最近更新 更多