我知道关于这个错误有很多类似的话题,但我尝试了一些建议,我的问题仍然没有解决。我遵循本教程:https://www.youtube.com/watch?v=B3gEbC37DAM
这是我的代码:
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();
}
但我仍然有错误。
提前感谢您的帮助!
连接可以为空的原因很简单。如果在连接之前执行的代码被分配,即在该代码成功运行之前:
String driver = "org.apache.derby.jdbc.ClientDriver";
Class.forName(driver).newInstance();
conn = DriverManager.getConnection("jdbc:derby//localhost:1527//db");
此代码必须成功运行才能使conn不为null,因此在对其调用close()
之前需要进行非null检查。
您不需要显式加载驱动程序(Class.forName
),假设您正在使用Java
您可以使用try-with-resources来管理自动关闭的对象(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可能会引发异常,将conn保留为null,这将导致在稍后尝试在finally块中关闭它时出现null指针。
最后,块总是执行,而你正在使用try catch,你可以得到一个潜在的NullPointerException
是当conn=DriverManager.get连接("jdbc: derby//localhost:1527//db");
抛出NullPointerException
,这是由你的捕获(Exception e)
,然后最后块开始执行,你做conn.close()
,但你的conn对象是NULL
再次抛出NullPointerException
,这是不被捕获的,因为你正在捕获<>cat(SQLException)
指针变量保存的是地址,而地址本质上是一个整数,所以指针变量可以进行部分运算,例如加法、减法、比较等,请看下面的代码: 运行结果: 从运算结果可以看出:pa、pb、pc 每次加 1,它们的地址分别增加 4、8、1,正好是 int、double、char 类型的长度;减 2 时,地址分别减少 8、16、2,正好是 int、double、char 类型长度的 2 倍。 这很奇怪,指针变量加减运算的结果跟
最近在review代码的时候发现,使用了空指针调用成员函数,并且成员函数内部有使用到成员变量,居然没有出错。很是奇怪,就用一篇博客把关于空指针调用成员函数相关的内容总结起来。 空指针调用成员函数 调用普通成员函数 如果空指针调用普通成员函数,看该函数体中是否使用到了this指针(是否访问非静态成员变量)。如果使用到了this指针,程序会崩溃;如果没有使用到this指针,程序不会崩溃。当然,如果访问
我有一个类型为的变量 在一个函数中,我检查它是否为,并希望以后使用它,而不必每次调用都必须。例如,在Kotlin中,IDE识别这样的检查,并在之后断言变量不能为。在C#中有这样的方法吗? 编辑:
在标记项处获取NullPointerException。getKey(),不明白问题出在哪里
嗨我有以下方法: 不得不提的是,startDate和endDate是长变量。我尝试在if条件中添加null检查,也尝试使用longValue()方法,但没有结果。你知道我怎样才能解决这个问题吗?可能是fndBugs端的bug?
我试图用以下代码指出声纳中的关键问题: 我也做了下面的更改,但仍然不起作用 请帮忙。