亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

撲克牌游戲關于玩家獲得手牌出現空指針異常

代碼我放到下面去了

為什么執行到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入門第三季
  • 參與學習       409767    人
  • 解答問題       4543    個

Java中你必須懂得常用技能,不容錯過的精彩,快來加入吧

進入課程

撲克牌游戲關于玩家獲得手牌出現空指針異常

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號