我知道有很多关于此错误的类似主题,但我尝试了一些建议,但我的问题仍未保存。 我遵循本教程: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) {
}
}
}
}
但我仍有错误。
提前感谢您的帮助!
答案 0 :(得分:0)
假设您使用的是Java> = 1.6,则无需显式加载驱动程序(Class.forName
)。
您可以使用try-with-resources来管理AutoCloseable对象(Connection
,PreparedStatement
和ResultSet
),因此您的代码可以写成:
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()
之前需要进行非空检查。