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

两个错误教训记录--java变量作用域问题导致变量值异常

背景一:

设计了用户输入4*4,然后数据库可以存储number1和number2和result,即4,4,16;

但是发现result无法存入数据库,进行多次debug后发现在进行计算方法calculate()后,result是有数据的,即result=16

后面终于找到出错位置了!即图中框起来的两个,第一个输出语句是result=16,而到了第二个就变成了result=0了,怀疑是重新赋值了....

 

后面终于解决了,其实就是这里的result我又重新定义了一遍,把前面的double去掉,在最外层定义result即可。

 

原因解释:

  • result是在if块内部声明的局部变量

  • 它的作用域仅限于这个if块内部

  • if块外部访问result时,实际上访问的是另一个未初始化的result变量(默认值0.0)

解决办法:在循环外部声明result

总结:

  1. Java变量作用域规则

    • 块级作用域(大括号{}内声明的变量只能在该块内访问)

    • 方法级作用域(方法内声明的变量可以在方法内任何位置访问)

  2. 调试技巧

    • 使用有区别的调试输出标签(如"if内"/"循环内")

    • 检查变量声明位置

    • 使用IDE的变量高亮功能查看变量作用域


背景二:

继续上一个背景,就是发现运算符+-*/这些同样存不进数据库!!!输出看到是乱码

第一个想到是编码问题,立马去检查了整个项目,都用的是UTF-8: 

接着debug发现op在运算时是没问题的,后面又被重新赋值成了‘\u0000’

跟上一个一样 是作用域问题。。。不多赘述了

分析下:

  •  当出现未初始化 char 变量的乱码时,是因为Java 中未显式初始化的 char 类型成员变量会默认值为 \u0000 (Unicode 空字符),而空字符在不同编码环境下的渲染成了乱码!(IDEA控制台可能渲染成  或其他乱码)

  • \u0000 是 Java 中的Unicode 转义字符,表示空字符(Null Character),对应 ASCII 码的 0(十进制)。简单来说,它是一个不可见、不可打印的字符

总结:

  1. 防御性编程:始终显式初始化变量

  2. 编码一致性:确保整个链路(代码文件、JVM、数据库、终端)统一使用 UTF-8

 

http://www.xdnf.cn/news/12186.html

相关文章:

  • calico/node is not ready: BIRD is not ready: BGP not established with xxx
  • sumatraPDF设置深色界面
  • ArcGIS Maps SDK for JavaScript:使用图层过滤器只显示FeatureLayer的部分要素
  • LG P9990 [Ynoi Easy Round 2023] TEST_90 Solution
  • 风机下引线断点检测算法实现
  • 免费wordpress模板下载
  • Astro深度解析:颠覆传统的前端架构革命,打造极致性能的现代Web应用
  • KMP 算法中 next 数组的构建函数 get_next
  • linux-------------------------进程间通信(上)
  • QMetaObject::invokeMethod调用失败
  • 摄像机ISP处理流程
  • 【面经分享】京东
  • springboot实现查询学生
  • Spring @Scheduled vs XXL-JOB vs DolphinScheduler vs Airflow:任务调度框架全景对比
  • 电子电路:什么是扩散电容?
  • PC 360安全浏览器
  • Spring Boot + MyBatis 集成支付宝支付流程
  • Hive的Parquet格式优化方法
  • AI应用工程师面试
  • html+css+js趣味小游戏~MissileGame街机挑战(附源码)
  • Hive SQL常见操作
  • 人工智能--大型语言模型的存储
  • 窗口聚合窗口聚合
  • YOLOv11 | 注意力机制篇 | 混合局部通道注意力MLCA与C2PSA机制
  • 【photoshop】专色浓度和专色密度
  • Python[数据结构及算法 --- 栈]
  • Mobile App UI自动化locator
  • 【数据结构】树形结构--二叉树(二)
  • JavaSec-XSS
  • 深入理解Java多态性:原理、实现与应用实例