JDBC 的 Connection 和 Statement 对象是按引用传递还是按值传递?

Are JDBC's Connection and Statement objects pass-by-reference or pass-by-value?

我正在学习使用 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 方法。

我的直觉告诉我们,ProjectDriver 中的 Connection 和 Statement 对象应该在 sqlInitialize 方法 运行 之后正确初始化为它们各自的形式,但事实并非如此。 Eclipse 在 IDE 中有空指针访问警告,并且在尝试 运行 stmt.ExecuteUpdate(sql);.

时抛出 NullPointerException 错误

我很确定这是一个愚蠢的问题,但我不知道如何 Google(或查询 Whosebug)为什么会这样。我知道我提供的代码并不是做我正在做的事情的正确方法,但我很好奇为什么会这样。我对 Java 中的按引用传递与按值传递的理解是,所有基元都是按值传递的,并且所有对象都是按引用传递的。在另一个 class 中对 Connection 和 Statement 对象所做的修改是否应该保留,即使在返回到 main 之后?

Java"passes references by value"。

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

为了处理资源,例如 JDBC ConnectionStatement,您通常需要使用 Execute Around idiom.

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