【问题标题】:Are JDBC's Connection and Statement objects pass-by-reference or pass-by-value? [duplicate]JDBC 的 Connection 和 Statement 对象是按引用传递还是按值传递? [复制]
【发布时间】: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 块中创建和关闭 ConnectionStatement 是否不合适,然后从该 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 工作中通常很有用,其中我们仅在之前定义了 ConnectionPreparedStatement 资源之后才生成 ResultSet

标签: java mysql jdbc pass-by-reference pass-by-value


【解决方案1】:

Java“按值传递引用”。

如果您在方法中分配参数,则不会影响调用者。但是,如果您修改参数指向的对象,那么引用该对象的每个变量都会看到修改(如果是多线程,则在内存模型的限制范围内)。

对于处理资源,例如 JDBC ConnectionStatement,您通常需要使用 Execute Around idiom

【讨论】:

  • 谢谢,这就是我要找的。我不知道该问什么问题,这是我需要知道的。
【解决方案2】:

Java 编程语言不支持按引用传递。 JDBC 是基于 Java 的 API。

【讨论】:

  • 其他编程语言使用按引用传递或按指针传递。但是在 Java 中,无论您传递什么类型的参数,相应的参数(原始变量或对象)都会得到该数据的副本。如果调用方法传递一个引用将指向同一个对象
  • 我知道java在技术上是“按值传递”,但传递的值是指向对象的指针。在使用(例如,ArrayLists)时,我观察到的行为是在调用的方法中修改对象会修改原始对象。我很困惑,为什么在这种情况下,在调用的方法中实例化对象并不能保持实例化。
猜你喜欢
  • 2013-02-09
  • 2013-05-03
  • 2013-01-21
  • 2015-06-12
  • 2015-01-12
  • 2016-11-28
  • 2017-11-14
相关资源
最近更新 更多