黑马程序员技术交流社区

标题: 局部变量手动赋值的小总结 [打印本页]

作者: 单凯    时间: 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!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2