0
我正在編寫代碼來嘗試創建一個玩AI的撲克。我已經提供了包含將處理玩遊戲的類的.jar文件,只要我獲得AI代碼的工作。Java異常:需要默認構造函數嗎?已經有一個
這樣說,我遇到了下面相當惱人的錯誤。爲了清楚起見,以下代碼塊包含錯誤,代碼的一部分調用我的播放器PokerGame.class
,PokerPlayer
接口,以及我的類擴展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
,爲了以防萬一,但這並沒有幫助。
是的,你有一個,但我可以說它對其他類不可見,因爲默認的構造函數有一個默認的acces修飾符。此外,錯誤消息中的'package'結構不會反映代碼中的'package'結構。您可能正在使用一些舊代碼,但沒有編譯。你是否嘗試在不同的包中移動類?你如何編譯你的代碼? – SomeJavaGuy
也許你還應該提供'PokerListener'類的代碼 – Marius
你沒有默認的構造函數,你只有一個包私有的非參數化構造函數。這是不同的。什麼是'blake.MyPokerPlayer'?你的代碼顯示'player.MyPokerPlayer'。 – Tom