为了账号安全,请及时绑定邮箱和手机立即绑定

扑克牌游戏关于玩家获得手牌出现空指针异常

代码我放到下面去了

为什么执行到p1.cards.add(c1);就空指针异常了?

谢谢,求解答

正在回答

6 回答

理论上逻辑也没啥错,你看看是不是eclipse抽风了,这样应该是可以的,逻辑上是没啥问题,或者你用dubug调试一下,如果实在不行,再回复我吧,可以一起找错误


0 回复 有任何疑惑可以回复我~

package com.poker;

 

import java.util.HashSet;

import java.util.Set;

 

public class Player {

  

 public String name;

 public int id;

 public Set<Card> cards;

  

 public  Player(int id,String name){

  this.id=id;

  this.name=name;

  this.cards = new HashSet<Card>();

 }

 public Player(){

   

 }

}

set集合是没有get方法的,你放进去是取不到值得,所以一直都是null

0 回复 有任何疑惑可以回复我~
#1

K_Muxs 提问者

不是的,我找到错误了 是我创建玩家对象的时候调用了无餐的构造函数,而我玩家类里面的无参的构造函数没有初始化这个Set
2016-09-30 回复 有任何疑惑可以回复我~
#2

qq_倔強人生_0 回复 K_Muxs 提问者

public Player(){ this.cards = new HashSet<Card>(); } 少了这个,我自己也没有注意,好久没用了。。
2016-09-30 回复 有任何疑惑可以回复我~
#3

K_Muxs 提问者 回复 qq_倔強人生_0

嗯,我检查到就加上去了,不报异常了。 顺便问句题外话,为什么看自己写的代码就看得很流畅,看别人写的就常常挺吃力的呢?
2016-09-30 回复 有任何疑惑可以回复我~
#4

qq_什么亡魂溺海没有跳海实在_03283094 回复 K_Muxs 提问者

因为你的代码是按照你自己的思维写的 你读的时候感觉顺理成章 你读别人的代码的时候可能感觉不到别人的思路 只能看到代码 所以感觉吃力 我也是这样 说到底还是打少了 哈哈
2016-12-13 回复 有任何疑惑可以回复我~
查看1条回复

set集合是没有get的方法

0 回复 有任何疑惑可以回复我~

 p1.cards.add(c1);//执行到这里就报空指针异常

  p2.cards.add(c2);

  p1.cards.add(c3);

  p2.cards.add(c4);

  System.out.println("玩家"+p1.name+"获得牌:"+c1.type+c1.num+","+c3.type+c3.num);

  System.out.println("玩家"+p2.name+"获得牌:"+c2.type+c2.num+","+c4.type+c4.num);

 }

这里错了,在存入集合以后是不能怎么取出来的

0 回复 有任何疑惑可以回复我~
#1

K_Muxs 提问者

我前面有 Card c1 = washedList.get();取出放入c1中了
2016-09-30 回复 有任何疑惑可以回复我~
#2

qq_倔強人生_0 回复 K_Muxs 提问者

在你的card类中你用的set集合把你取出来的四张牌全部放进了set集合名为cards里面,而cards是set集合,他是没有顺序的,所以是取不出来的,只能通过遍历一个个赋值。
2016-09-30 回复 有任何疑惑可以回复我~
#3

qq_倔強人生_0 回复 K_Muxs 提问者

p1.cards.add(c1);//执行到这里就报空指针异常 p2.cards.add(c2); p1.cards.add(c3); p2.cards.add(c4); 你已经把取出来的放进了set集合cards里面了,所以一直都是null;
2016-09-30 回复 有任何疑惑可以回复我~
package com.poker;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.Scanner;

public class Playing {
 
 public List<Card> cardsToSelect;  //没有洗牌的序列
 public List<Card> washedList;  //洗牌后的序列
 public Scanner input = new Scanner(System.in);
 public Random random = new Random();
 Player p1 = new Player();
 Player p2 = new Player();

 public Playing() {
  this.cardsToSelect = new ArrayList<Card>();
 }

 
 //把牌添加到cardsToSelect序列中
 public void addCard() {
  Card[] heitao = { new Card("黑桃", "A"), new Card("黑桃", "2"),
    new Card("黑桃", "3"), new Card("黑桃", "4"), new Card("黑桃", "5"),
    new Card("黑桃", "6"), new Card("黑桃", "7"), new Card("黑桃", "8"),
    new Card("黑桃", "9"), new Card("黑桃", "10"), new Card("黑桃", "J"),
    new Card("黑桃", "Q"), new Card("黑桃", "K") };
  Card[] hongtao = { new Card("红桃", "A"), new Card("红桃", "2"),
    new Card("红桃", "3"), new Card("红桃", "4"), new Card("红桃", "5"),
    new Card("红桃", "6"), new Card("红桃", "7"), new Card("红桃", "8"),
    new Card("红桃", "9"), new Card("红桃", "10"), new Card("红桃", "J"),
    new Card("红桃", "Q"), new Card("红桃", "K") };
  Card[] meihua = { new Card("梅花", "A"), new Card("梅花", "2"),
    new Card("梅花", "3"), new Card("梅花", "4"), new Card("梅花", "5"),
    new Card("梅花", "6"), new Card("梅花", "7"), new Card("梅花", "8"),
    new Card("梅花", "9"), new Card("梅花", "10"), new Card("梅花", "J"),
    new Card("梅花", "Q"), new Card("梅花", "K") };
  Card[] fangkuai = { new Card("方块", "A"), new Card("方块", "2"),
    new Card("方块", "3"), new Card("方块", "4"), new Card("方块", "5"),
    new Card("方块", "6"), new Card("方块", "7"), new Card("方块", "8"),
    new Card("方块", "9"), new Card("方块", "10"), new Card("方块", "J"),
    new Card("方块", "Q"), new Card("方块", "K") };
  cardsToSelect.addAll(Arrays.asList(heitao));
  cardsToSelect.addAll(Arrays.asList(hongtao));
  cardsToSelect.addAll(Arrays.asList(meihua));
  cardsToSelect.addAll(Arrays.asList(fangkuai));
  System.out.println("==========创建扑克牌==========");
  System.out.println("==========创建扑克牌成功==========");
 }

 //利用循环把添加的牌打印出来
 public void showCard() {
  int size = cardsToSelect.size();
  System.out.println("==========添加了如下扑克牌==========");
  for (int i = 0; i < size; i++) {
   System.out.print(cardsToSelect.get(i).type
     + cardsToSelect.get(i).num + ",");
  }
  System.out.println();
 }
 
 //创建两个玩家
 public void creatPlayer() {
  while (true) {
   try {
    System.out.println("输入第一个玩家的ID:");
    p1.id = input.nextInt();
    System.out.println("输入第一个玩家的姓名:");
    p1.name = input.next();  
    System.out.println("输入第二个玩家的ID:");
    p2.id = input.nextInt();
    System.out.println("输入第二个玩家的姓名:");
    p2.name = input.next();
    break;
   } catch (Exception e) {
    System.out.println("输入有误,请重试");
    input = new Scanner(System.in);
   }
  }
  System.out.println("欢迎玩家:"+p1.name+","+p2.name);
 }

 public void washAndGetCard() {
  int size = cardsToSelect.size();//获得cardsToSelect序列的长度
  List<Card> washedList = new ArrayList<Card>();//生成一个新的序列存放无序的牌
  for (int i = 0; i < size; i++) {
   Card temp = new Card();
   do {
    temp = cardsToSelect.get(random.nextInt(size
   } while (washedList.contains(temp));
   washedList.add(temp);));//利用生成随机数在原本的序列中随机抽取不同的牌添加到新的序列中去
  }
  Card c1=washedList.get(0);//因为washedList里面的牌是无序的
  Card c2=washedList.get(1);//所以直接取前四张牌
  Card c3=washedList.get(2);
  Card c4=washedList.get(3);
  p1.cards.add(c1);//执行到这里就报空指针异常
  p2.cards.add(c2);
  p1.cards.add(c3);
  p2.cards.add(c4);
  System.out.println("玩家"+p1.name+"获得牌:"+c1.type+c1.num+","+c3.type+c3.num);
  System.out.println("玩家"+p2.name+"获得牌:"+c2.type+c2.num+","+c4.type+c4.num);
 }

 public static void main(String[] args) {

  Playing t = new Playing();
  t.addCard();
  t.showCard();
  t.creatPlayer();
  t.washAndGetCard();
  
 }
}
//Card类

package com.poker;

public class Card {

 public String num;
 public String type;

 public Card(String type, String num) {
  this.num = num;
  this.type = type;
 }
 
 public Card(){
  
 }
}
//Player类

package com.poker;

import java.util.HashSet;
import java.util.Set;

public class Player {
 
 public String name;
 public int id;
 public Set<Card> cards;
 
 public  Player(int id,String name){
  this.id=id;
  this.name=name;
  this.cards = new HashSet<Card>();
 }
 public Player(){
  
 }
}


0 回复 有任何疑惑可以回复我~

washedList是一个我存放无序扑克牌的序列,检查过了是可以的。

我用get()方法把前四张牌取出来,添加到玩家的Set集里面去

p1.cards.add(c1);

为什么执行到这一步就报异常 空指针异常?

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Java入门第三季
  • 参与学习       409789    人
  • 解答问题       4340    个

Java中你必须懂得常用技能,不容错过的精彩,快来加入吧

进入课程

扑克牌游戏关于玩家获得手牌出现空指针异常

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信