2016-05-23 29 views
0

我正在編寫代碼來嘗試創建一個玩AI的撲克。我已經提供了包含將處理玩遊戲的類的.jar文件,只要我獲得AI代碼的工作。Java異常:需要默認構造函數嗎?已經有一個

這樣說,我遇到了下面相當惱人的錯誤。爲了清楚起見,以下代碼塊包含錯誤,代碼的一部分調用我的播放器PokerGame.classPokerPlayer接口,以及我的類擴展PokerPlayer接口。

這是例外:

Exception in thread "main" java.lang.RuntimeException: Class blake.MyPokerPlayer must have a default constructor 
    at pokergame.PokerGame.loadPlayer(PokerGame.java:84) 
    at pokergame.PokerGame.<init>(PokerGame.java:100) 
    at pokergame.PokerGame.main(PokerGame.java:590) 
    at blake.MyPokerPlayer.main(MyPokerPlayer.java:18) 
Caused by: java.lang.NoSuchMethodException: blake.MyPokerPlayer.<init>() 
    at java.lang.Class.getConstructor0(Class.java:3082) 
    at java.lang.Class.getConstructor(Class.java:1825) 
    at pokergame.PokerGame.loadPlayer(PokerGame.java:78) 
    ... 3 more 

這是代碼:

package pokergame; 

import java.util.*; 
import java.lang.reflect.*; 

public class PokerGame implements PokerListener { 
    // Other methods above 
    private PokerPlayer loadPlayer(String classname) { 
     PokerPlayer ret = null; 
     try { 
      Class<?> cls = Class.forName(classname); 
      Constructor<?> ctor = cls.getConstructor(); 
      Object o = ctor.newInstance(); 
      ret = (PokerPlayer)o; 
     } catch (ClassNotFoundException e) { 
      throw new RuntimeException("Cannot find player class: " + classname, e); 
     } catch (NoSuchMethodException e) { 
      throw new RuntimeException("Class " + classname + " must have a default constructor", e); 
     } catch (ClassCastException e) { 
      throw new RuntimeException("Player class does not implement PokerPlayer interface: " + classname, e); 
     } catch (Exception e) { 
      throw new RuntimeException("Error trying to instantiate player class: " + classname, e); 
     } 
     return ret; 
    } 
    // Other methods below 
} 

package pokergame; 

public interface PokerPlayer extends PokerListener { 
    int numChips(); 
    void collectChips(int numChips); 
    void acceptChips(int numChips); 
    void setId(String id); 
    PokerDecision decide(PokerGameDetails game, int betRequiredToCall); 
    PokerHand bestHand(); 
} 

package player; 

import java.util.*; 
import pokergame.*; 

public class MyPokerPlayer implements PokerPlayer { 
    private String id; 
    private ArrayList<PokerCard> handCards = new ArrayList<>(); 
    private ArrayList<PokerCard> tableCards = new ArrayList<>(); 
    private ArrayList<PokerCard> deck = new ArrayList<>(); 
    private int numChips; 

    public static void main(String[] args) { 
     PokerGame.main(new String[]{"pokerstooges.Larry", "player.MyPokerPlayer"}); 
    } 

    MyPokerPlayer() { } 

    // *************** 
    // THESE NEED WORK 
    // *************** 

    public void onEvent(PokerEvent e) { 
     if (e instanceof PokerNewHandEvent) { System.out.println(e); } 
     else if (e instanceof PokerPlayerEliminatedEvent) { System.out.println(e); } 
     else if (e instanceof PokerPotDistributionEvent) { System.out.println(e); } 
     else if (e instanceof PokerCollectingBlindEvent) { System.out.println(e); } 
     else if (e instanceof PokerNewCardEvent) { System.out.println(e); } 
     else if (e instanceof PokerDecisionEvent) { System.out.println(e); } 
     else if (e instanceof PokerHandRevealEvent) { System.out.println(e); } 
    } 

    public PokerDecision decide(PokerGameDetails game, int betRequiredToCall) { 
     PokerDecision decision = new PokerDecision(PokerDecision.TYPE.FOLD); 
     return decision; 
    } 

    public String toString() { 
     // Something here... 
     return ""; 
    } 

    // ***************** 
    // THESE SHOULD WORK 
    // ***************** 

    public int numChips() { return this.numChips; } 
    public void collectChips(int numChips) { this.numChips -= numChips; } 
    public void acceptChips(int numChips) { this.numChips += numChips; } 
    public void setId(String id) { this.id = id; } 
    public String getId() { return this.id; } 

    public PokerHand bestHand() { 
     ArrayList<String> hands = new ArrayList<>(); 
     String handCardString = handCards.get(0) + " " + handCards.get(1); 
     if (tableCards.size() == 0) { 
      hands.add(handCardString); 
     } 
     else if (tableCards.size() == 3) { 
      hands.add(handCardString + " " + tableCards.get(0) + " " + tableCards.get(1) + " " + tableCards.get(2)); 
     } 
     else if (tableCards.size() > 3) { 
      hands.add(handCardString + " " + tableCards.get(0) + " " + tableCards.get(1) + " " + tableCards.get(2)); 
      hands.add(handCardString + " " + tableCards.get(0) + " " + tableCards.get(1) + " " + tableCards.get(3)); 
      hands.add(handCardString + " " + tableCards.get(0) + " " + tableCards.get(2) + " " + tableCards.get(3)); 
      hands.add(handCardString + " " + tableCards.get(1) + " " + tableCards.get(2) + " " + tableCards.get(3)); 
      if (tableCards.size() == 5) { 
       hands.add(handCardString + " " + tableCards.get(0) + " " + tableCards.get(1) + " " + tableCards.get(4)); 
       hands.add(handCardString + " " + tableCards.get(0) + " " + tableCards.get(2) + " " + tableCards.get(4)); 
       hands.add(handCardString + " " + tableCards.get(0) + " " + tableCards.get(3) + " " + tableCards.get(4)); 
       hands.add(handCardString + " " + tableCards.get(1) + " " + tableCards.get(2) + " " + tableCards.get(4)); 
       hands.add(handCardString + " " + tableCards.get(2) + " " + tableCards.get(3) + " " + tableCards.get(4)); 
      } 
     } 

     PokerHand bestHand = compareHands(hands); 
     return bestHand; 
    } 
    public PokerHand compareHands(ArrayList<String> hands) { 
     PokerHand handA = new PokerHand(hands.remove(0)); 
     PokerHand handB; 
     if (hands.size() == 1) { return new PokerHand(hands.remove(0)); } 
     else if (hands.size() > 2) { handB = compareHands(hands); } 
     else { handB = new PokerHand(hands.remove(0)); } 

     if (handA.compareTo(handB) > 0) { return handA; } 
     else { return handB; } 
    } 
    private void addCards(List<String> cardStrings) { 
     for (String cardString : cardStrings) { deck.add(new PokerCard(cardString)); } 
    } 
} 

由於MyPokerPlayer顯示,有一個默認的構造函數:

MyPokerPlayer() { } 

我曾嘗試在它前面加public,爲了以防萬一,但這並沒有幫助。

+0

是的,你有一個,但我可以說它對其他類不可見,因爲默認的構造函數有一個默認的acces修飾符。此外,錯誤消息中的'package'結構不會反映代碼中的'package'結構。您可能正在使用一些舊代碼,但沒有編譯。你是否嘗試在不同的包中移動類?你如何編譯你的代碼? – SomeJavaGuy

+0

也許你還應該提供'PokerListener'類的代碼 – Marius

+3

你沒有默認的構造函數,你只有一個包私有的非參數化構造函數。這是不同的。什麼是'blake.MyPokerPlayer'?你的代碼顯示'player.MyPokerPlayer'。 – Tom

回答

0

似乎是例外(Class blake.MyPokerPlayer must have a default constructor),並在您的代碼段的類的類之間的不匹配(player.MyPokerPlayer

你可以檢查你傳遞的類名loadPlayer(字符串)?

此外,構造函數MyPokerPlayer是包範圍,可能會導致運行時失敗反射調用(請將構造函數公開)。 這通常是一個問題,因爲pokergame包不是定義類的人。