Исключение Java: требуется конструктор по умолчанию? Есть уже один

Я пишу код, чтобы попытаться создать покер, играя AI. Меня обеспечили .jar файлы, содержащие классы, которые будут обрабатывать играть в игру, пока я получаю код AI работает.

С учетом сказанного, я сталкиваюсь со следующей довольно раздражающей ошибкой. Для ясности следующий блок кода содержит ошибку, раздел кода, вызывающий мой плеер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перед ним, на всякий случай, но это тоже не помогает.

1 ответ

  1. Кажется, что существует несоответствие между классом в exception (Class blake.MyPokerPlayer must have a default constructor) и классом в фрагменте кода (player.MyPokerPlayer)

    Можете ли вы проверить имя класса, которое вы передаете loadPlayer (String)?

    Кроме того, конструктор MyPokerPlayer имеет область действия пакета, что может привести к сбою рефлексивного вызова среды выполнения (сделайте конструктор общедоступным).
    Это обычно было бы проблемой, так как пакет pokergame не определяет класс.