A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 丘凤光 金牌黑马   /  2013-3-18 19:44  /  1461 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 丘凤光 于 2013-3-18 20:55 编辑

刚才逛论坛是看别人的一段代码,忽然想到一个自己平时不太在意的地方,简化的代码如下
  1. class A
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int i;
  6.                 int t=4,p=6;
  7.                 while(t<p)
  8.                 {
  9.                         i=5;
  10.                         t++;
  11.                 }
  12.                 System.out.println(i);
  13.         }
  14. }
复制代码
编译时提示i为初始化。疑问:为什么变量不能在循环体里初始化?平时像这样需要注意的地方还有哪些呢?
希望大神帮忙指点指点。

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

8 个回复

倒序浏览
注意:报的错误是 可能 尚未初始化变量i
我的理解是:
t,p虽然赋了值,但 t,p为变量(我可能随时改变t,p值)->while循环体中的内容可能执行不到->输出未知的i

你把输出语句放在循环体里面->要么执行循环体,i一定有值->不执行,那也不输出i

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
因为编译器是检查语法问题,你的while条件t<p,对编译器来说它是不知道到底是false还是true的,那么如果while内的语句没被执行,i变量就没有初始化.

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
作用域的问题你要好好比对你自己的逻辑,
你可以这让认为,认为程序中代码不一定会走赋值的代码那块,所以它不能让你这么干!
这样就类似于if ,你写很多if 但是实际上用得上的有有几个呢?
希望对你有帮助!

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 何仕映 于 2013-3-18 20:38 编辑

这个就要想到jvm对堆内存和栈内存中变量的处理了。
因为这你定义的这个变量是在盏内存中,在栈内存中的变量,jvm是不会给它默认初始化的。必须在建立的时候就初始化一个值。
堆内存中时,就不一样。比如Person 的年龄属性int age,在建立的时候jvm会先给它默认初始化。int类型为0;
总之,在盏内存中在建立时必须显式初始化。

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
class A
{
        public static void main(String[] args)
        {
                int i;                //注意:   int i; 是局部变量
                int t=4,p=6;
                while(t<p)
                {
                        i=5;
                        t++;
                }
                System.out.println(i);
        }
}

在一个类中,如果是成员变量,在声明好之后,就会给它一个默认值的初始值。
但局部变量必须要手动初始化。
你可以先赋一个int i=0;

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
局部变量在定义的时候就要初始化,指的是i。
程序在执行到 int i;时,会在栈中创建一个4个字节的内存区域用于存贮整形的值。
因为你为指定它的值,那这4个字节所存放的东西是未知的,就可能出现不可预知的错误。
Java在编译阶段指出这个错误,是为了避免以后出现问题

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
定义局部变量的两个要素,变量名和初始化值,否则jvm不能识别,会报错
因为i在局部变量中定义时,必须初始化,
回复 使用道具 举报
刚才改了一下代码
  1. class A
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int i;
  6.                 while(true)
  7.                 {
  8.                         i=5;
  9.                         break;
  10.                 }
  11.                 System.out.println(i);
  12.         }
  13. }
复制代码
可以看出确实是因为循环体里的赋值语句i=5有可能执行不到所以编译报错。
从内存上解析更深刻。都谢谢大家啊。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马