Nano Hash - криптовалюты, майнинг, программирование

Java — установка BooleanProperty вызывает ошибку java.lang.StackOverflowError.

Я не буду публиковать весь код, только те части, которые с ним связаны. На самом деле я не очень хорошо знаком с созданием собственного слушателя, и в этой книге это еще не рассмотрено. Возможно, я делаю это неправильно, но вы можете просмотреть приведенный ниже код и убедиться в этом сами. В основном, когда я меняю значение, он продолжает пытаться установить значение или что-то снова и снова, я попытался отследить его с помощью точки останова, чтобы увидеть, смогу ли я поймать проблему, но, возможно, я что-то упустил... Отслеживание проблемы остановилось на эта конкретная строка кода, которая устанавливает значение BooleanProperty и остается там каждый раз, когда я перемещаю ее вперед на строку.

вот мой конструктор объектов и поле данных

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);
}

Вот методы получения, установки и свойств

/** 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;
}

а вот слушатель в классе создавшем объект

    // Set the binds for each player
    for (int i = 0; i < players - 1; i++) {
        alPlayerHand.get(i).endTurnProperty().addListener(e -> {
            progressTurn();
        });
    }

Изменить: я забыл добавить эту строку, в которой трассировка застревает

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
}

Изменить: снова забыл код

/** 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);
}

Наконец, вот ошибка - большая часть была удалена, потому что она просто повторяется.

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)

Я был бы очень признателен за любые советы относительно того, что я делаю неправильно, в книге пока описывалось только создание свойств привязки... но никогда не освещалась внутренняя работа, а только то, как были настроены методы без видимых операторов внутри них.

По сути, я хочу, чтобы игроки делали свой ход, если игрок управляется ИИ, тогда компьютер принимает решение, и в конце любого из них он устанавливает значение endTurn, которое затем заставит слушателя вызывать метод progressTurn, и цикл продолжается


  • Ну, по-видимому, у вас есть что-то, что вы слушаете, когда endTurn изменяется... и затем устанавливаете это. (Честно говоря, endTurn мне не кажется свойством, но это другое дело...) 22.08.2014
  • Да, извините за то, что я забыл кое-какой код. Я поместил сеттер для конца хода на свой собственный, чтобы я мог сохранить несколько строк кода, так как я использую его в разных местах, например, когда игрок нажимает кнопку, он выполняет свою собственную отдельная команда, но я могу изменить это позже... Я в основном настраиваю все, а затем собираюсь вернуться к ней и очистить код. 22.08.2014
  • Ну, что вы на самом деле не смогли показать, так это то, что код, который подключается к endTurn, изменился! событие, которое, по-видимому, затем вызывает processTurn, которое само по себе изменяет endTurn и т. д. Вы понимаете, почему это вызывает проблему? 22.08.2014
  • Кстати, извините за код, если он кажется немного запутанным, это моя первая попытка реального проекта в Java, и я все еще новичок в концепции программирования, управляемого событиями. 22.08.2014
  • Понял. Я подозреваю, что вы не сможете получить реальный ответ здесь... в основном это вопрос понимания того, почему вы находитесь в нынешнем рассоле, в котором находитесь. (И да, программирование, управляемое событиями, может быть болезненным... или прекрасным.) 22.08.2014
  • Хорошо, позвольте мне попытаться немного прояснить ситуацию... когда игрок начинает новую игру, он создает объекты игрока, а затем создает слушателей для 'public BooleanProperty endTurnProperty() {' в объекте playerhand, чтобы он вызывал on progressTurn... Я еще не настроил его, но когда игра запускается, он в основном вызывает progressTurn до тех пор, пока не наступит ход игрока, не являющегося ИИ, после чего, когда игрок выбирает такой вариант, как ставка, проверка, колл или сворачиваясь, игра вызовет метод endTurn, устанавливающий конец хода и отключающий прослушиватель... цикл продолжается 22.08.2014
  • Давайте продолжим обсуждение в чате. 22.08.2014
  • Боюсь, у меня сейчас нет времени болтать. Может быть, кто-то еще сможет помочь. 22.08.2014
  • К сожалению, я не вижу проблемы в предоставленном коде. Однако, по моему опыту, каждый раз, когда я получал ошибку StackOverFlow, это было связано с вызовом метода getter. Однако я уверен, что проблема может быть в другом месте, если это не так. 23.08.2014
  • в Casino_Poker.PlayerHand.setEndTurn(PlayerHand.java:188) в Casino_Poker.Main.endTurn(Main.java:1041) в Casino_Poker.Main.progressTurn(Main.java:1014) в Casino_Poker.Main.lambda$TexasHoldEm$16(Main .java:972) в Casino_Poker.Main$$Lambda$13/477174400.invalidated(Неизвестный источник) ‹- Извините за копирование части трассировки стека, но, учитывая, что трассировка стека повторяется в этой области вашей программы, проблема, вероятно, заключается в там. 23.08.2014
  • Спасибо @Frazinator, который действительно помогает, и я плохо разбираюсь в этом. 23.08.2014
  • Если вы хотите, чтобы я помог дальше, не стесняйтесь спрашивать. Я буду стараться изо всех сил. 23.08.2014
  • @Frizinator, когда я вызвал метод получения логического свойства в операторе if, я предполагаю, что он отключил моего слушателя, поэтому я заменил его на «if (playersTurn% 2 == 0)» 23.08.2014
  • Это решило проблему? 23.08.2014
  • @Frazinator я думаю, что я все еще не уверен точно, но это было связано с геттером, потому что, когда я перестал использовать геттер для проверки значения на истинность, он снова начал работать 23.08.2014

Ответы:


1

Когда я вызвал геттер для логического свойства в операторе if метода endTurn(), я предполагаю, что он отключил мой слушатель, поэтому я заменил его на «if (playersTurn% 2 == 0)».

23.08.2014
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..