首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java -设置BooleanProperty会导致“java.lang.StackOverflowError”

Java -设置BooleanProperty会导致“java.lang.StackOverflowError”
EN

Stack Overflow用户
提问于 2014-08-23 03:08:01
回答 1查看 613关注 0票数 0

我不会张贴所有的代码,只是与之相关的部分。我真的不太熟悉创建自己的侦听器,这本书还没有涉及到这一点。也许我做错了,但你可以查看下面的代码,自己看看。基本上,当我改变值时,它会一遍又一遍地尝试设置值或其他东西,我试图用断点跟踪它,看看是否能捕捉到问题,但可能我错过了something...Tracing问题。问题停在设置BooleanProperty值的特定代码行,并在每次我将其向前移动一行时停留在那里。

下面是我的对象构造函数和数据字段

代码语言:javascript
复制
private BooleanProperty endTurn;

/** Constructor */
public PlayerHand() {
    // Set the Data Field values
    super.playerCards = new ArrayList<>();
    this.chips = 100;
    this.lastBet = 0;
    this.endTurn = new SimpleBooleanProperty(this, "endTurn", false);
}

下面是getter、setter和property方法

代码语言:javascript
复制
/** Get whether the player has ended the turn */
public boolean getEndTurn() {
    return this.endTurn.get();
}

/** Set's the end of turn */
public void setEndTurn(boolean endTurn) {
    this.endTurn.setValue(endTurn);
}

/** Property getter method for ending the turn */
public BooleanProperty endTurnProperty() {
    return this.endTurn;
}

下面是创建该对象的类中的侦听器

代码语言:javascript
复制
    // Set the binds for each player
    for (int i = 0; i < players - 1; i++) {
        alPlayerHand.get(i).endTurnProperty().addListener(e -> {
            progressTurn();
        });
    }

编辑:我忘了添加这一行,这是跟踪卡住的地方

代码语言:javascript
复制
public void progressTurn() {
    // Have AI make their decisions and turn rules on and off
    if (alPlayerHand.get(playersTurn).getLastBet() == 0) {
        if (alPlayerHand.get(playersTurn).isLittleBlind() &&
                currentGameRound == 1) {
            alPlayerHand.get(playersTurn).setBet(littleBlind);
            lastPlayer = "Little Blind";
        } else if (alPlayerHand.get(playersTurn).isBigBlind() &&
                currentGameRound == 1) {
            alPlayerHand.get(playersTurn).setBet(bigBlind);
            lastPlayer = "Big Blind";
        } else if (alPlayerHand.get(playersTurn).isAI()) {
            alPlayerHand.get(playersTurn).decide();
            lastPlayer = alPlayerHand.get(playersTurn).getLastMove();
        }
    }
    // Add the last bet to the pot
    pot += alPlayerHand.get(playersTurn).getLastBet();
    alPlayerHand.get(playersTurn).setBet(0);

    if ((playersTurn + 1) <= players - 1 &&
        alPlayerHand.get(playersTurn).isAI()) {
        playersTurn++;
    } else if ((playersTurn + 1) > players - 1 &&
        alPlayerHand.get(playersTurn).isAI())
        playersTurn = 0;

    endTurn(); // Debug stops here and stays here
}

编辑:再次忘记代码

代码语言:javascript
复制
/** End the current players turn */
public void endTurn() {
    // End Players turn
    if (alPlayerHand.get(playersTurn).getEndTurn()) {
        alPlayerHand.get(playersTurn).setEndTurn(false);
    } else
        alPlayerHand.get(playersTurn).setEndTurn(true);
}

最后是错误-大多数已经被删除,因为它只是重复自己

代码语言:javascript
复制
Exception in thread "JavaFX Application Thread" java.lang.StackOverflowError
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:109)
at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:143)
at javafx.beans.property.BooleanProperty.setValue(BooleanProperty.java:77)
at Casino_Poker.PlayerHand.setEndTurn(PlayerHand.java:188)
at Casino_Poker.Main.endTurn(Main.java:1043)
at Casino_Poker.Main.progressTurn(Main.java:1014)
at Casino_Poker.Main.lambda$TexasHoldEm$16(Main.java:972)
at Casino_Poker.Main$$Lambda$13/477174400.invalidated(Unknown Source)
at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:135)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
at javafx.beans.property.BooleanPropertyBase.fireValueChangedEvent(BooleanPropertyBase.java:103)
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)
at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:143)
at javafx.beans.property.BooleanProperty.setValue(BooleanProperty.java:77)
at Casino_Poker.PlayerHand.setEndTurn(PlayerHand.java:188)
at Casino_Poker.Main.endTurn(Main.java:1041)
at Casino_Poker.Main.progressTurn(Main.java:1014)
at Casino_Poker.Main.lambda$TexasHoldEm$16(Main.java:972)
at Casino_Poker.Main$$Lambda$13/477174400.invalidated(Unknown Source)
at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:135)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
at javafx.beans.property.BooleanPropertyBase.fireValueChangedEvent(BooleanPropertyBase.java:103)
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)
at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:143)
at javafx.beans.property.BooleanProperty.setValue(BooleanProperty.java:77)
at Casino_Poker.PlayerHand.setEndTurn(PlayerHand.java:188)
at Casino_Poker.Main.endTurn(Main.java:1043)
at Casino_Poker.Main.progressTurn(Main.java:1014)
at Casino_Poker.Main.lambda$TexasHoldEm$16(Main.java:972)
at Casino_Poker.Main$$Lambda$13/477174400.invalidated(Unknown Source)
at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:135)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
at javafx.beans.property.BooleanPropertyBase.fireValueChangedEvent(BooleanPropertyBase.java:103)
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)
at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:143)
at javafx.beans.property.BooleanProperty.setValue(BooleanProperty.java:77)
at Casino_Poker.PlayerHand.setEndTurn(PlayerHand.java:188)
at Casino_Poker.Main.endTurn(Main.java:1043)
at Casino_Poker.Main.progressTurn(Main.java:1014)
at Casino_Poker.Main.lambda$TexasHoldEm$16(Main.java:972)
at Casino_Poker.Main$$Lambda$13/477174400.invalidated(Unknown Source)
at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:135)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
at javafx.beans.property.BooleanPropertyBase.fireValueChangedEvent(BooleanPropertyBase.java:103)
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)
at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:143)
at javafx.beans.property.BooleanProperty.setValue(BooleanProperty.java:77)
at Casino_Poker.PlayerHand.setEndTurn(PlayerHand.java:188)
at Casino_Poker.Main.endTurn(Main.java:1041)
at Casino_Poker.Main.progressTurn(Main.java:1014)
at Casino_Poker.Main.lambda$TexasHoldEm$16(Main.java:972)
at Casino_Poker.Main$$Lambda$13/477174400.invalidated(Unknown Source)
at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:135)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
at javafx.beans.property.BooleanPropertyBase.fireValueChangedEvent(BooleanPropertyBase.java:103)
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)
at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:143)
at javafx.beans.property.BooleanProperty.setValue(BooleanProperty.java:77)
at Casino_Poker.PlayerHand.setEndTurn(PlayerHand.java:188)
at Casino_Poker.Main.endTurn(Main.java:1043)
at Casino_Poker.Main.progressTurn(Main.java:1014)
at Casino_Poker.Main.lambda$TexasHoldEm$16(Main.java:972)
at Casino_Poker.Main$$Lambda$13/477174400.invalidated(Unknown Source)
at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:135)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
at javafx.beans.property.BooleanPropertyBase.fireValueChangedEvent(BooleanPropertyBase.java:103)
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)
at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:143)
at javafx.beans.property.BooleanProperty.setValue(BooleanProperty.java:77)
at Casino_Poker.PlayerHand.setEndTurn(PlayerHand.java:188)
at Casino_Poker.Main.endTurn(Main.java:1041)
at Casino_Poker.Main.progressTurn(Main.java:1014)
at Casino_Poker.Main.lambda$TexasHoldEm$16(Main.java:972)
at Casino_Poker.Main$$Lambda$13/477174400.invalidated(Unknown Source)
at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:135)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
at javafx.beans.property.BooleanPropertyBase.fireValueChangedEvent(BooleanPropertyBase.java:103)
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)
at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:143)
at javafx.beans.property.BooleanProperty.setValue(BooleanProperty.java:77)
at Casino_Poker.PlayerHand.setEndTurn(PlayerHand.java:188)
at Casino_Poker.Main.endTurn(Main.java:1043)
at Casino_Poker.Main.progressTurn(Main.java:1014)
at Casino_Poker.Main.lambda$TexasHoldEm$16(Main.java:972)
at Casino_Poker.Main$$Lambda$13/477174400.invalidated(Unknown Source)
at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:135)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
at javafx.beans.property.BooleanPropertyBase.fireValueChangedEvent(BooleanPropertyBase.java:103)
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)
at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:143)
at javafx.beans.property.BooleanProperty.setValue(BooleanProperty.java:77)
at Casino_Poker.PlayerHand.setEndTurn(PlayerHand.java:188)
at Casino_Poker.Main.endTurn(Main.java:1041)
at Casino_Poker.Main.progressTurn(Main.java:1014)
at Casino_Poker.Main.lambda$TexasHoldEm$16(Main.java:972)
at Casino_Poker.Main$$Lambda$13/477174400.invalidated(Unknown Source)
at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:135)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
at javafx.beans.property.BooleanPropertyBase.fireValueChangedEvent(BooleanPropertyBase.java:103)
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)
at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:143)
at javafx.beans.property.BooleanProperty.setValue(BooleanProperty.java:77)
at Casino_Poker.PlayerHand.setEndTurn(PlayerHand.java:188)
at Casino_Poker.Main.endTurn(Main.java:1043)
at Casino_Poker.Main.progressTurn(Main.java:1014)
at Casino_Poker.Main.lambda$TexasHoldEm$16(Main.java:972)
at Casino_Poker.Main$$Lambda$13/477174400.invalidated(Unknown Source)
at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:135)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
at javafx.beans.property.BooleanPropertyBase.fireValueChangedEvent(BooleanPropertyBase.java:103)
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)
at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:143)
at javafx.beans.property.BooleanProperty.setValue(BooleanProperty.java:77)
at Casino_Poker.PlayerHand.setEndTurn(PlayerHand.java:188)
at Casino_Poker.Main.endTurn(Main.java:1043)
at Casino_Poker.Main.progressTurn(Main.java:1014)
at Casino_Poker.Main.lambda$TexasHoldEm$16(Main.java:972)
at Casino_Poker.Main$$Lambda$13/477174400.invalidated(Unknown Source)
at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:135)
at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
at javafx.beans.property.BooleanPropertyBase.fireValueChangedEvent(BooleanPropertyBase.java:103)
at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)

我真的很感激任何关于我做错了什么的建议,这本书只介绍了绑定属性的创建,所以far...but从来没有介绍过内部的工作原理,只有方法是如何设置的,其中的语句是看不见的。

基本上,我希望玩家进行他们的移动,如果玩家是AI控制的,那么计算机做出决定,并在结束时设置endTurn值,然后导致侦听器调用progressTurn方法,循环继续

EN

回答 1

Stack Overflow用户

发布于 2014-08-23 10:55:44

当我在endTurn()方法的if语句中调用布尔属性的getter时,我假设它触发了我的侦听器,所以我所做的就是用'if (playersTurn %2 == 0)‘替换它

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25453977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档