【发布时间】:2020-05-28 07:50:06
【问题描述】:
我现在正在学习使用 MySQL,我对实例化和初始化我的 Connection 和 Statement 对象的直觉如下:
public class ProjectDriver {
public static void main(String[] args)
{
Connection conn = null;
Statement stmt = null;
Initializer.sqlInitialize(conn,stmt);
...
}
...
}
sql初始化:
public static void sqlInitialize(Connection conn, Statement stmt) {
try {
conn = DriverManager.getConnection(DB_URL, USER, PASS);
stmt = conn.createStatement();
}
catch (SQLException se) {
se.printStackTrace();
}
catch (Exception e) {
e.printStackTrace();
}
...
}
以及稍后关闭连接和语句的 sqlClose 方法。
我的直觉是,在运行 sqlInitialize 方法后,应该将 ProjectDriver 中的 Connection 和 Statement 对象正确初始化为各自的形式,但事实并非如此。 Eclipse 在 IDE 中有空指针访问警告,尝试运行 stmt.ExecuteUpdate(sql); 时会抛出 NullPointerException 错误。
我很确定这是一个愚蠢的问题,但我无法弄清楚如何通过谷歌搜索(或询问 StackOverflow)为什么会发生这种情况。我知道我提供的代码并不是我正在做的事情的正确方法,但我很好奇为什么会发生这种情况。我对 Java 中的按引用传递与按值传递的理解是,所有原语都是按值传递的,并且所有对象都是按引用传递的。对另一个类中的 Connection 和 Statement 对象所做的修改不应该保留,即使在返回到 main 之后?
【问题讨论】:
-
顺便学习一下现代Java中的try-with-resources语法,关闭你的
Connection等等。见Tutorial。 -
@BasilBourque 在 try-with-resources 块中创建和关闭
Connection和Statement是否不合适,然后从该 twr 块中简单地调用几十个方法? -
你可以这样做。在
{…}块完成(或引发异常)之前,括号中包含的资源不会关闭。您还可以将 try-with-resources 嵌套在另一个 try-with-resources 中。警告:我无法想象为什么你会在 JDBC try-with-resources 块中调用几十个方法。大多数情况下,您应该有一小段代码与数据库交换数据,然后退出 try-with-resources(关闭您的资源)——然后在 之后继续处理数据尝试资源。但总有例外。 -
@BasilBourque 这是一个 A.P. 研究项目。我需要生成...大量数据,以几种数字生成形式的几种排列方式;项目完成后总共会有大约 140 张桌子,但我正在努力遵循惯例,以便在我高中毕业时至少完成一个符合惯例标准的重要项目。如果嵌套的 try 块不包含声明或实例化,那只会使其成为常规的 try 块,对吗?
-
查看问题:How should I use try-with-resources with JDBC?,尤其是my Answer。请注意嵌套的 try-with-resources 在 JDBC 工作中通常很有用,其中我们仅在之前定义了
Connection和PreparedStatement资源之后才生成ResultSet。
标签: java mysql jdbc pass-by-reference pass-by-value