当前位置: 首页 > news >正文

Java 参数值传递机制

一个很经典的问题: java的方法入参 是值传递还是地址传递?

答案是:值传递。

今天排查一个生产问题,数据库链接资源没有关闭。

大致代码逻辑如下:

try{Preparestatement ps = null;String sql = "select * from tableA where id=?";this.query(ps,sql);
}catch(Exception e){logger.error("error:",e);
}finally{if(ps!=null){ps.close();}
}private void query(Preparestatement ps ,String sql){ps = this.getPreparestatement();........//不重要的查询逻辑
}

可以看到 对象实例 ps 被传到了一个私有方法:query(Preparestatement ps ,String sql) 里,并在方法里面进行赋值。然后在方法外进行判空关闭。

很明显,这段代码的作者,并不熟悉JAVA的值传递机制,虽然ps被传到方法里赋值,但是方法外的ps对象依然还是null,所以finally模块里的代码并没有执行close。只是表面看起来会关闭资源。

实际上,方法外的ps,和方法里面的ps 并不是同一个对象,或者说并不是指向同一个地址。java传递的是值而不是地址。这是和C语言最大的区别。

Java可以在方法里修改对象的属性(如 a.setName("myName")),这种修改是可以影响到方法外的对象,但是并不能通过=号,对对象进行重新赋值来影响方法外的对象(如a=getNewObject())

http://www.dtcms.com/a/204984.html

相关文章:

  • 采用线性优化改进评估配电网的灵活性范围
  • docker-compose使用详解
  • Unity中SRP Batcher使用整理
  • BeamDojo: Learning Agile Humanoid Locomotion on Sparse Footholds
  • 【深度估计 Depth Estimation】数据集介绍
  • 静态方法和实例方法的区别
  • NVIDIA GPU 性能调优与诊断完全指南
  • PortgreSQL常用操作
  • shell脚本总结3
  • 网络安全管理之钓鱼演练应急预案
  • Python 训练营打卡 Day 31
  • Dirsearch 深度使用教程:从基础扫描到携带 Cookie 探索网站
  • Java—— IO流 第二期
  • PCB设计实践(二十三)什么是阻抗匹配,需要做啥
  • springboot链接nacos测试
  • 项目执行中缺乏风险管理,如何预防潜在问题?
  • 惠斯通电桥测量 数据采集模块 支持恒压/恒流的24位ADC电桥测量
  • PCB设计教程【入门篇】——电路分析基础-元件数据手册
  • 设计模式介绍
  • 解除diffusers库的prompt长度限制(SDXL版)
  • vue原生table表格实现动态添加列,一行添加完换行继续添加。el-select输入框背景颜色根据所选内容不同而改变
  • 深入解读RTP协议:RFC 3550的技术分析与应用
  • 在线地图瓦片URL
  • Spring Framework 的 spring-core 和 Spring Security 兼容版本
  • springboot3+vue3融合项目实战-大事件文章管理系统-自定义校验
  • 预警功能深度测评:如何用系统降低设备突发故障率?
  • 基于 STM32 的 PC ARGB 风扇控制器设计与实现
  • 工作安排小K
  • Elasticsearch生产环境性能调优指南
  • Unity中GPU Instancing使用整理