Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是JDBC';s连接和语句对象是按引用传递还是按值传递?_Java_Mysql_Jdbc_Pass By Reference_Pass By Value - Fatal编程技术网

Java 是JDBC';s连接和语句对象是按引用传递还是按值传递?

Java 是JDBC';s连接和语句对象是按引用传递还是按值传递?,java,mysql,jdbc,pass-by-reference,pass-by-value,Java,Mysql,Jdbc,Pass By Reference,Pass By Value,目前我正在学习使用MySQL,我实例化和初始化连接和语句对象的本能如下: 公共类项目驱动程序{ 公共静态void main(字符串[]args) { 连接conn=null; 语句stmt=null; sqlInitialize(conn,stmt); ... } ... } sqlInitialize: publicstaticvoidsqlinitialize(连接连接,语句stmt){ 试一试{ conn=DriverManager.getConnection(DB_URL,USER,P

目前我正在学习使用MySQL,我实例化和初始化连接和语句对象的本能如下:

公共类项目驱动程序{
公共静态void main(字符串[]args)
{
连接conn=null;
语句stmt=null;
sqlInitialize(conn,stmt);
...
}
...
}
sqlInitialize:

publicstaticvoidsqlinitialize(连接连接,语句stmt){
试一试{
conn=DriverManager.getConnection(DB_URL,USER,PASS);
stmt=conn.createStatement();
} 
捕获(SQLSE异常){
se.printStackTrace();
} 
捕获(例外e){
e、 printStackTrace();
}
...
}
以及一个sqlClose方法,用于稍后关闭连接和语句

我的直觉告诉我,在运行sqlInitialize方法之后,ProjectDriver中的Connection和Statement对象应该正确地初始化为各自的形式,但事实肯定不是这样。Eclipse在IDE中有一个空指针访问警告,并且在尝试运行
stmt.ExecuteUpdate(sql)时抛出一个NullPointerException错误

我很确定这是一个愚蠢的问题,但我不知道如何用谷歌搜索(或询问StackOverflow)为什么会发生这种情况。我知道我提供的代码并不是我正在做的事情的正确方式,但我很好奇为什么会发生这种情况。我对Java中按引用传递与按值传递的理解是,所有原语都是按值传递的,所有对象都是按引用传递的。即使在返回到main之后,对另一个类中的连接和语句对象所做的修改是否应该保留?

Java“按值传递引用”

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


对于处理资源,例如JDBC
连接
语句
,您通常需要使用。

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

顺便说一句,了解现代Java中的try with resources语法,关闭
连接
等等。请参阅。@BasilBourque在try-with-resources块中创建并关闭
连接
语句
,然后从t-w-r块中调用几十个方法是否不合适?您可以这样做。在
{…}
块完成(或引发异常)之前,括号中包含的资源不会关闭。您还可以在另一个try with resources中嵌套一个try with resources。警告:我无法想象为什么在一个JDBC try with resources块中会调用几十个方法。大多数情况下,您应该有少量与数据库交换数据的代码,并退出try with resources(关闭资源),然后在try with resources之后继续处理数据。但总有例外。@BasilBourque这是一个美联社的研究项目。我需要生成。。。大量数据,以数种形式的排列生成;当这个项目完成时,总共会有大约140个表格,但我正在努力遵循惯例,这样到我高中毕业时,我至少有一个重要的项目按照惯例标准完成了。如果嵌套的try块不包含声明或实例化,那么这将使其成为常规try块,对吗?请参阅问题:,尤其是。请注意,嵌套的try-with-resources在JDBC工作中通常很有用,在JDBC工作中,我们只有在前面定义了
连接
PreparedStatement
资源之后才能生成
ResultSet
。其他编程语言使用按引用传递或按指针传递。但是在Java中,无论您传递的参数类型是什么(原语变量或对象),都会得到该数据的副本。如果一个方法调用传递了一个引用将指向同一个对象,我知道java在技术上是“按值传递”,但传递的值是指向该对象的指针。在使用ArrayList(例如ArrayList)的过程中,我观察到的行为是在一个名为“修改原始对象”的方法中修改对象。我很困惑,为什么在这个例子中,在一个名为的方法中实例化对象并不能保持它的实例化。谢谢,这就是我想要的。我不知道该问什么问题,这是我需要知道的。