潜在的空指针访问。该位置的变量可能为null。显示java.lang.NullPointerException

时间:2017-09-11 10:12:22

标签: java nullpointerexception

我知道有很多关于此错误的类似主题,但我尝试了一些建议,但我的问题仍未保存。 我遵循本教程:https://www.youtube.com/watch?v=B3gEbC37DAM&list=PL1A506B159E5BD13E&index=2

这是我的代码:

select * from TABLED limit 1,4

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

我尝试了类似主题的解决方案,如下所示:

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) {
        }

    }
  }
}

但我仍有错误。

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

假设您使用的是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可能抛出一个Exception,将conn保留为null,当你稍后尝试在finally块中关闭它时会导致空指针。

答案 1 :(得分:0)

最后在您使用try catch时执行Block,在NullPointerException引发conn = DriverManager.getConnection("jdbc:derby//localhost:1527//db"); NullPointerException时,您可以获得潜在的catch (Exception e)然后最后阻止开始执行conn.close(),但是你的conn对象是NULL,它再次抛出NullPointerException,但是没有被捕获,因为你抓住了catch (SQLException e) < / p>

答案 2 :(得分:-1)

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

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

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