如果写成这样也不报错:
switch ((int) (Math.random() * 3)) {
  
case 0:
return new Circle();
case 1:
return new Square();
                   default: return null;
  
}这是为什么啊?对default用法和位置感到迷惑

解决方案 »

  1.   

    明确前提:
    1.default的用法是:当在它之前的所有case的值都未匹配时执行它后边的语句;
    2.你的函数要返回一个值;
    3.先了解一般的写法如下:
      switch(i)
      {
        case 0:
          j++;
          break;
        case 1:
          j += 2;
          break;
        default:
          j += 3;
          break;
      }
      请注意break的使用,在switch程序体内,break之后的语句将不被执行.分析原因:
    1.你的第一个语句之所以没有语法错误是因为: 
    你在default:之后没有break;语句,程序在执行到default:之后继续往下执行,当执行到 case 0:
    return new Circle();时,因为遇到了return语句,正确返回;
    2.如果将第一个语句的前一个default注释掉,将 "//default:   //default写在这里报错:the method must return a result of type shape" 的注释打开,这样就会抱错,因为你在default:之后没有return任何值,你想:如果程序执行到default却没有return语句,这当然是错误的.3.你的第二个语句 default: return null;当然是正确的,因为它有return语句.
      

  2.   

    to : mxc1974(山鹰) :
     Math.random() * 3 他的范围是 (0,3)
    所以假如为3,先default,然后case,遇不到如果是3该怎么办?不还是没有返回值么?
      

  3.   

    看来你对switch的用法还不了解,当switch括号中的值与 case,default中的任何一个值匹配时,将执行其中的代码,如果代码的最后没有break;语句,代码也不再判断其值是否匹配而将一直执行下去(执行每一个case或default里的语句),一直到遇到break;语句或者return;语句或者到结尾.所以第一种情况,不管switch的值是几,程序都会执行 case 0:
    return new Circle(); 
      

  4.   

    我想我的意思你没有明白,如果Math.random() * 3 产生的值为3,
    先匹配default,不相同,然后再case 0 ,还不同,然后再case 1
    结果发现没有相同的?
    这个时候编译器返回什么了?
    所以如果值是 3,rreturn new Circle();  或者 return new Square();根本就没有执行
    哪来的返回值?