标题: 局部变量手动赋值的小总结 [打印本页] 作者: 单凯 时间: 2013-8-2 21:03 标题: 局部变量手动赋值的小总结 今天看了几个别人求助的帖子,很多自认为了解的突然就变的有点问题,不过终于想明白了,所以总结一下,先谢谢那些提问的童鞋们。
有个帖子是关于局部变量赋值的问题,代码如下:
public class Test
{
public static void main(String[] args)
{
int x;
for (int i = 0; i < 10; i++)
{
x = i;
}
System.out.println(x);
}
}
编译会提示The local variable x may not have been initialized这个错误,我给他的回答是这样的: 局部变量不会被系统默认初始化,成员变量才会,x在for循环里被赋值后,用完就释放了,所以循环完后x里面仍旧没有值,所以会提示未初始化。
但我又看到了这样一个关于for循环的帖子,内容如下:
class Demo
{
public static void main(String[] args)
{
int x;
for( x=0;x<5;)
{
x=x++;
}
System.out.println(x);
}
} 这个程序是不出结果的,由于有了上个帖子的回复经验,我连编译一下都没有直接回复了初始化的问题,循环里的x在循环结束后,值就不存在了,后来才知道是我错了,上面的那个程序是个死循环,所以打印不出结果(看来以后回答问题得自己运行一遍才行啊)解决方法就是把赋值运算拿掉,直接自增操作就可以跳出循环了。
但我就有疑惑了,两个程序其实差不多,第二个程序中的x也是局部变量,也是在for循环里被赋值,为何第二个程序就不会出现编译问题?于是我意识到我在一个帖的回复是错的,i确实是被释放了,但x并没有,然后我把第一个程序做了一点改动,我把i的赋值动作拿出来,这样i就不会被释放了:
public class text
{
public static void main(String[] args)
{
int x,i = 0;
for ( ; i < 10; i++)
{
x = i;
}
System.out.println(x);
}
}
但是这样仍旧会有The local variable x may not have been initialized这个错误,可见我在一个帖中的回复确实是错的,x并没有被释放,而且里面确实有值,第二个程序就是证明,那第一个程序到底哪里出了问题呢?
然后我又做了如下的修改:
public class text
{
public static void main(String[] args)
{
int x,i;
for ( x=0 ,i= 0; i < 10; i++)
{
x = i;
}
System.out.println(x);
}
} 这次编译运行成功了,我很诧异,为啥呢,运行完后x里面明明就有值,为何还不通过编译,还提示局部变量没有初始化值呢?突然我就想通了,原来是for循环在第一次循环就可能不满足条件,后面的语句很可能不被执行,所以就存在x不被赋值的可能,就有了那个错误的提示。
所以说,我在那两个帖子中的回答全错了,我也终于理解了The local variable x may not have been initialized这句话的含义,局部变量x可能没有被初始化,然后就强制输出一个不存在的值,错误在此。
希望大家在以后的编程过程中,显示地给局部变量赋初值,不要出现模棱两可的“可能未赋值”问题。作者: 许庭洲 时间: 2013-8-7 06:56
值得学习ing!