for (int i = 0; i < s.length; i++) {
            s[i] = gen.next();
            for (Shape shp : s) {
                shp.draw();
            }
        }这两层循环有些冗余
for (int i = 0; i < s.length; i++) {  for 循环就是想遍历数组s 
for (Shape shp : s) { for -each 循环也是遍历数组s 
楼主的空指针问题出在 Shape[] s = new Shape[3];
楼主只 初始化了长度为3 的Shape 型的数组,但是却没有给s[i] 挨个赋值,即没有给数组元素指向对象的引用
所以 shp 都是null ,再调用draw 就空指针了

解决方案 »

  1.   

    我的看法是switch case中default应该放在最后
      

  2.   

    把main函数改成这样就行了,你循环2次了
     public static void main(String[] args) {
            // TODO Auto-generated method stub
     
            Shape[] s = new Shape[3];
            for (int i = 0; i < s.length; i++) {
                gen.next().draw();
                
            }
        }
      

  3.   

    一楼是正确的。
    Shape[] s = new Shape[3];//定义未初始化
            for (int i = 0; i < s.length; i++) {
                s[i] = gen.next();//初始化一个
                for (Shape shp : s) {
                    shp.draw();//第一次遍历的时候只有s[0],初始化,其他的都没有
                }