class CC
{
public static void main(String[] args) 
{
int i,j;
for (i=1;i<=5 ;i++ )
{
for (j=1;j<=5 ;j++ )
{
 System.out.print("*"+"\t");
}
                  System.out.println("*");
}
          System.out.println(i);
          System.out.println(j);
        }
}为什么上面这个程序在编译时出错,提示"可能尚未初始化变量 j"class C
{
public static void main(String[] args) 
{
int j;
for (j=1;j<=5 ;j++ )
{
  System.out.print("*"+"\t");
}
  System.out.println(j);
        }
}而为什么上面这个程序在编译时却可以通过呢谢谢大家了!

解决方案 »

  1.   

    不清楚,这两个程序都对啊,你再看看环境变量对吗,我用的是jcreator,你也可以用记事本编辑,然后在命令行下用javac命令编译
      

  2.   

    第一个我用myeclipse,也是提示运行时错误,具体我也不懂
      

  3.   

    楼主的问题确实存在,我也费解。我是这样理解的:
    先明确下局部变量的内存分配:
    局部变量,由声明在某方法,或某代码段里(比如for循环),执行到它的时候或者说初始化后在栈中开辟内存,并存放初始值,当局部变量一但脱离作用域,内存立即释放。
    因为for (j=1;j <=5 ;j++ )嵌套在for (i=1;i <=5 ;i++ ) 循环里面,所以作为循环体的局部变量,j的初始化只是在for (i=1;i <=5 ;i++ ) 循环体里有效,出了循环体就无效了。for (i=1;i <=5 ;i++ )每次循环结束,j就释放内存空间,下次循环开始时j重新分配一次内存,所以前后j进行了5次内存分配,而出了for (i=1;i <=5 ;i++ )循环体后,j其实只是得到声明,并没有赋初始值,所以没有分配到内存空间,因而编译器报j未初始化的错。而如果在声明j的时候就将其初始化,j获得内存分配,且在整个main()中j都是占用这块内存不变,j循环语句中操纵的也是这块内存。
    以上纯属浅见,还望高人指点!class CC 

    public static void main(String[] args) 

    int i;
    int j;
    //int j = 2; 
    for (i=1;i <=5 ;i++ ) 

    for (j=1;j <=5 ;j++ ) 

    System.out.print("*"+"\t"); 

          System.out.println("*"); 
          System.out.println();
          System.out.println(j);

        System.out.println(i); 
        //System.out.println(j); 
      }
      

  4.   

    不懂上面说的  
     只有类的成员变量可以不用在定义的时候就初始化, 
    你的i,j是局部变量不初始化会有问题的。 
    所以就出现可能出错

    i,j都是全局变量。而且i没问题只有j在输出的时候会报错
      

  5.   

    因为你定义的i和j都是局部变量,在定义局部变量的时候最好要初始化。
    方法里的变量在执行完成后变量的空间会被收走,for循环里也是这样的,在这个两层循环中内层循环j先结束,结束了内存中的空间就没了,而i在判断6<=5后空间还没来得及被收走,所以i能访问到j访问不到。
      

  6.   

    请记住:定义在方法内的局部变量要先赋值!
    [color=#FF00FF]我也是初学者,与楼主共勉![/color]
      

  7.   

    我也新学的哈
    class cc {
    public static void main(String[] args) 

    int i,j = 0; //这样就好了 
    for (i=1;i <=5 ;i++ ) 

            for (j=1;j <=5 ;j++ ) 
            { 
            System.out.print("*"+"\t"); 
            //System.out.println(j);    //把=0删了 在循环里你试试,把/ /去了  
            } 
    System.out.println("*"); 

    System.out.println(i); 
    System.out.println(j);//要不j=0 你不在那个FOR循环里j的值系统用完就扔了,现在j就是个空的 
            } 
      

  8.   

    按照小弟的理解是这样的,第一个程序只要把i,j声明为static  就可以编译了:
    class CC 

    static int i,j;
    public static void main(String[] args) 


    for ( i=1;i<=5 ;i++ ) 

    for ( j=1;j<=5 ;j++ ) 

    System.out.print("*"+"\t"); 

          System.out.println("*"); 

              System.out.println(i); 
              System.out.println(j);