两个错误教训记录--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
总结:
-
Java变量作用域规则:
-
块级作用域(大括号
{}
内声明的变量只能在该块内访问) -
方法级作用域(方法内声明的变量可以在方法内任何位置访问)
-
-
调试技巧:
-
使用有区别的调试输出标签(如"if内"/"循环内")
-
检查变量声明位置
-
使用IDE的变量高亮功能查看变量作用域
-
背景二:
继续上一个背景,就是发现运算符+-*/这些同样存不进数据库!!!输出看到是乱码
第一个想到是编码问题,立马去检查了整个项目,都用的是UTF-8:
接着debug发现op在运算时是没问题的,后面又被重新赋值成了‘\u0000’
跟上一个一样 是作用域问题。。。不多赘述了
分析下:
- 当出现未初始化
char
变量的乱码时,是因为Java 中未显式初始化的char
类型成员变量会默认值为\u0000
(Unicode 空字符),而空字符在不同编码环境下的渲染成了乱码!(IDEA控制台可能渲染成�
或其他乱码)
\u0000
是 Java 中的Unicode 转义字符,表示空字符(Null Character),对应 ASCII 码的 0(十进制)。简单来说,它是一个不可见、不可打印的字符
总结:
-
防御性编程:始终显式初始化变量
-
编码一致性:确保整个链路(代码文件、JVM、数据库、终端)统一使用 UTF-8