java吧 关注:1,244,743贴子:12,721,258
  • 25回复贴,共1

关于局部变量的问题,求解?????对小白很有用!!!!!!

只看楼主收藏回复

众所周知,定义局部变量时必须对其进行初始化,也就是赋值。那么接下来我有3个小程序,都是关于局部变量初始化的。
-----------------------------------------------------------------------------------------------------------------
第一个程序是正确的:
public class A
{
public static void main(String[] args)
{int a ;
a= 1; //对局部变量r定义并赋值,即初始化
}
}
第二个程序也是正确的:
public class A
{
public static void main(String[] args)
{int a; //定义一个局部变量a
switch (2)
{
case 1: a = 1;
break;
case 2: a = 2;
break;
} //整个switch中是对局部变量进行赋值,即初始化
}
}
第三个程序存在错误:
public class A
{
public static void main(String[] args)
{int a; //定义一个局部变量a
switch (2)
{
case 1: a = 1;
break;
case 2: a = 2;
break;
} //整个switch中是对局部变量进行赋值,即初始化
System.out.println(a); //这里多了一个对局部变量a的操作就会报一个“a尚未初始化”的错误
}
}
-----------------------------------------------------------------------------------------------------------------
请问各位大神,程序3和程序2一样对局部变量进行了初始化,为什么还会报出a没有初始化??????


1楼2015-05-08 19:21回复
    6英寸长,2英寸宽,上面有小脑袋,而且女人为它痴迷的东西。


    IP属地:湖南2楼2015-05-08 19:24
    回复
      @angel徽


      3楼2015-05-08 19:31
      收起回复
        @小马_lsl


        5楼2015-05-08 19:32
        回复
          局部变量定义时要赋值,不然调用时会报错,编译时通不过。


          IP属地:上海6楼2015-05-08 19:38
          收起回复
            目测这是因为在编译时报错,而你在运行时才赋值


            IP属地:四川来自iPhone客户端7楼2015-05-08 19:41
            收起回复
              {int a; //定义一个局部变量a
              switch (2)
              {
              case 1: a = 1;
              break;
              case 2: a = 2;
              break;
              } //整个switch中是对局部变量进行赋值,即初始化
              System.out.println(a); //这里多了一个对局部变量a的操作就会报一个“a尚未初始化”的错误
              }
              你这里的初始化是在选择判断语句中的,如果没有符合条件就进入不了选择判断中初始化。而你的程序在判断语句外面调用了变量,程序不确定a能不能被初始化,就以为a没有初始化,编译就不会通过。


              9楼2015-05-08 19:44
              收起回复
                改成这样就不会报错了
                public static void main(String[] args) {
                int a; // 定义一个局部变量a
                switch (2) {
                case 1:
                a = 1;
                break;
                case 2:
                a = 2;
                break;
                default://增加default语句
                a = 3;//并赋值
                } // 整个switch中是对局部变量进行赋值,即初始化
                System.out.println(a); // 这里多了一个对局部变量a的操作就会报一个“a尚未初始化”的错误
                }


                IP属地:四川10楼2015-05-08 19:45
                回复
                  因为编译阶段系统无法知道switch中的值是不是被所有的case所包含,所以它会认为存在没有为a赋值的可能性,加上default语句给a赋值后就把所有情形都补满了,所以不再报错。大概是这意思,可能用词不太漂亮


                  IP属地:四川11楼2015-05-08 19:48
                  回复
                    至于第二个程序,你根本没有使用a这个变量,自然不会报错,你可以试试把整个switch语句全删掉,还是不报错的


                    IP属地:四川12楼2015-05-08 19:50
                    收起回复
                      a的作用域只在switch中


                      IP属地:上海来自iPhone客户端13楼2015-05-08 19:52
                      回复
                        没对a赋值


                        14楼2015-05-09 10:27
                        收起回复