初学java,做一个扑克牌的作业。创建了三个类:Bridge/Cardmain/Piece。代码分别如下:   
   public class Bridge {
private Piece[] pieces;
private String[] numbers;
private String[] images;public Bridge(){    Piece[] pieces = new Piece[52];
    String[] numbers={"King","Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen"};
    String[] images={"Diamonds","Clubs","Hearts","Spades"};
  
}
public void setorder(){
for(int j=0;j<images.length;j++){
  for(int i=0;i<numbers.length;i++){
      pieces[12*j+i].setimage(images[j]);
      pieces[12*j+i].setnumber(numbers[i]);
  }
}
}
public void getpieces(int j,int k){
    System.out.println(pieces[12*j+k].getnumber()+" Of "+pieces[12*j+k].getimage());
}}
public class Piece{
private String number;
private String image;
private boolean t;public Piece(){
number="Ace";
image="Diamonds";
t=false;
}public String getnumber(){
return number;
}
public String getimage(){
return image;
}
public void setnumber(String x){
number=x;
}
public void setimage(String y){
image=y;
}
}
public class Cardmain {
    public static void main(String args[]){
        Scanner s = new Scanner(System.in);
        Bridge nbridge =new Bridge();
        nbridge.setorder();        System.out.println("Please input your to-distribute cardnumber: ");
        int num = s.nextInt();
        System.out.println("Please input your to-distribute cardimage: ");
        System.out.println("***************Option******************");
        System.out.println("0:Diamond  1:Clubs  2:Hearts  3:Spades ");
        System.out.println("***************************************");
        int im = s.nextInt();
        nbridge.getpieces(im, num);
        
   }
}但在执行到这一步时有问题: Bridge nbridge =new Bridge();
        nbridge.setorder();
新建的nbridge对象在构造时numbers数组和images数据都有赋值,调用setorder方法时调试是就发现nbridge中数组的引用都为空了,这究竟是怎么回事呢?

解决方案 »

  1.   

    private Piece[] pieces;
    private String[] numbers;
    private String[] images;public Bridge(){    Piece[] pieces = new Piece[52];
        String[] numbers={"King","Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen"};
        String[] images={"Diamonds","Clubs","Hearts","Spades"};
      
    }这个是2个对象  所以等于没有初始化
      

  2.   

    public Bridge(){    Piece[] pieces = new Piece[52];
        String[] numbers={"King","Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen"};
        String[] images={"Diamonds","Clubs","Hearts","Spades"};
      
    }==〉
    public Bridge(){    pieces = new Piece[52];
        numbers={"King","Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen"};
        images={"Diamonds","Clubs","Hearts","Spades"};
      
    }
      

  3.   

    public Bridge(){
        // 你原来的写法,是局部变量
        pieces = new Piece[52];
        for (int i = 0; i < pieces.length; i++) {
          // 初始化了数组,还要初始化每个元素
          pieces[i] = new Piece();
        }
        numbers={"King","Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen"};
        images={"Diamonds","Clubs","Hearts","Spades"};
      
    }
      

  4.   

    Piece[] pieces = new Piece[52];
    只是声明了一个对象数组,但并未初始化
      

  5.   

    感谢2楼回复!但我删去String[]后netbeans反而报错,说缺少";",不是语句,这又是怎么回事呢?
      

  6.   

    {"Diamonds","Clubs","Hearts","Spades"}的方式只能在变量命名初始化时候用
    如果在构造方法里初始化,用new String[] {"Diamonds","Clubs","Hearts","Spades"}
      

  7.   

    也就是说,你可以
    private String[] images = {"Diamonds","Clubs","Hearts","Spades"};直接初始化
    或者在构造方法里
    images = new String[] {"Diamonds","Clubs","Hearts","Spades"};
      

  8.   


    private Piece[] pieces;
    private String[] numbers;
    private String[] images;public Bridge(){    Piece[] pieces = new Piece[52];
        String[] numbers={"King","Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen"};
        String[] images={"Diamonds","Clubs","Hearts","Spades"};
      
    }之前有朋友提出了这个错误,你在constructor中使用的String[] numbers={"King","Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen"}; 
    String[] images={"Diamonds","Clubs","Hearts","Spades"};
    和你在class里的private String [] number;
    private String[] images;并不是相同的对象。等于是你在constructor中申明了两个同你的private members无关的对象,所以你的constructor并没有初始化其中两个private members。正确的应该是
    private Piece[] pieces;
    private String[] numbers;
    private String[] images;public Bridge(){    Piece[] pieces = new Piece[52];//array可以在用的时候再初始化,不过用时小心NullPointerException
        this.numbers={"King","Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen"};
        this.images={"Diamonds","Clubs","Hearts","Spades"};
      
    }
      

  9.   

    Piece[] pieces = new Piece[52];
    没有new对象
      

  10.   

    这问题是局部变量和this混淆不清的引起的,建议你看看成员变量和局部变量的区别,然后再看看构造器初始化的过程。另外你的硬编码问题很严重。
    下边也是一个扑克牌的例子,你参考一下。
    -----------------PuKe.java-------------------
    import java.util.*;/**
     * 扑克
     * http://www.juheit.com
     */
    public class PuKe{

    /**
     * 花色
     */
    private int pukeColor;

    /**
     * 大小
     */  
    private int pukeNum;

    /**
     * 构造器
     */
    public PuKe(int pukeColor, int pukeNum){
    this.pukeColor = pukeColor;
    this.pukeNum = pukeNum;
    }

    /**
     * Setter Getter
     */
    public int getPukeColorInt(){
    return this.pukeColor;
    }

    /**
     * 构建一幅扑克牌
     */
    public List createPukeList(){

    List<PuKe> pukeList = new ArrayList<PuKe>();

    //四种花色,每种花色13张牌
    for(int i = IPuKeConstant.PUKE_COLOR_B; i <= IPuKeConstant.PUKE_COLOR_P; i ++){
    for(int j = IPuKeConstant.PUKE_NUM_A; j <= IPuKeConstant.PUKE_NUM_K; j ++){
    pukeList.add(new PuKe(i, j));
    }
    }
    //添加大小王
    pukeList.add(new PuKe(IPuKeConstant.PUKE_COLOR_K, IPuKeConstant.PUKE_NUM_L));
    pukeList.add(new PuKe(IPuKeConstant.PUKE_COLOR_K, IPuKeConstant.PUKE_NUM_G));

    return pukeList;
    }

    /**
     * 分堆
     */
    public List createPukeGroupList(List pukeList){

    //扑克堆集合
    List<PuKeGroup> pukeGroupList = new Vector<PuKeGroup>();//同时取放,防止并发异常

    ////////进行分组
    //迭代每张扑克牌
    Iterator pukeIterator = pukeList.iterator();

    while(pukeIterator.hasNext()){
    PuKe currentPuke = (PuKe)pukeIterator.next();
    //取得扑克花色
    int pukeColor = currentPuke.getPukeColorInt();

    //定义查找标识
    boolean findFlag = false;

    //对堆进行迭代
    Iterator pukeGroupIterator = pukeGroupList.iterator();

    while(pukeGroupIterator.hasNext()){
    //取得当前的堆
    PuKeGroup currentPkeGroup = (PuKeGroup)pukeGroupIterator.next();
    //取得堆的扑克花色
    int pukeGroupColor = currentPkeGroup.getPukeColor();

    if(pukeColor == pukeGroupColor){
    currentPkeGroup.getPukeSubList().add(currentPuke);
    findFlag = true;//找到,反转标识
    break;
    }
    }

    //如果没有找到
    if(!findFlag){
    List<PuKe> pukeSubList = new ArrayList<PuKe>();//床架扑克子集合
    pukeSubList.add(currentPuke);//将扑克放到子集合中

    pukeGroupList.add(new PuKeGroup(pukeColor, pukeSubList));
    }
    }
    return pukeGroupList;
    }
    }/**
     * 扑克堆
     * http://www.juheit.com
     */
    class PuKeGroup{ /**
     * 花色
     */
    private int pukeColor;

    /**
     * 扑克集合
     */
    private List<PuKe> pukeSubList;

    /**
     * 构造器
     */
    public PuKeGroup(int pukeColor, List pukeSubList){
    this.pukeColor = pukeColor;
    this.pukeSubList = pukeSubList;
    }

    /**
     * 取得扑克花色
     */
    public int getPukeColor(){
    return this.pukeColor;
    }

    /**
     * 取得扑克分组的扑克集合
     */
    public List getPukeSubList(){
    return this.pukeSubList;
    }
    } /**
     * 扑克常量接口
     * http://www.juheit.com
     */
    interface IPuKeConstant{

    /**
     * 扑克A
     */
    public static final int PUKE_NUM_A = 1; /**
     * 扑克K
     */
    public static final int PUKE_NUM_K = 13; /**
     * 扑克小王
     */
    public static final int PUKE_NUM_L = 14;

    /**
     * 扑克大王
     */
    public static final int PUKE_NUM_G = 15;

    /**
     * 扑克花色黑桃
     */
    public static final int PUKE_COLOR_B = 1;

    /**
     * 扑克花色红桃
     */
    public static final int PUKE_COLOR_R = 2;

    /**
     * 扑克花色草花
     */
    public static final int PUKE_COLOR_F = 3;

    /**
     * 扑克花色方片
     */
    public static final int PUKE_COLOR_P = 4; /**
     * 扑克花色王
     */
    public static final int PUKE_COLOR_K = 5;

    }
      

  11.   

      多谢11楼和13楼的指点~真的是初学java~还有很多搞不清楚,以后定多调试多看程序!