有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java布尔值在明显为true时返回false

所以我的应用程序有一个超级简单的多人游戏。当玩家玩的游戏结束时,布尔值gameFinished变为真。游戏中发生的大多数事情首先检查gameFinished是否等于false,这就是我的问题所在。游戏结束后,我的布尔值明显设置为true,日志返回false,因此游戏继续循环

下面是获得游戏结果的方法

    private void getResults() {
    HomePage.getCurrentGameID(new HomePage.CallbackID() {
        @Override
        public void onSuccess(final String currentGameID) {
                games.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull final DataSnapshot dataSnapshot) {
                        HomePage.getUserPosition(new HomePage.CallbackPosition() {
                            @Override
                            public void onSuccess(int position) {
                                if (dataSnapshot.child(currentGameID).child("gameFinished").getValue().equals(false)) {
                                    if (position == 1) {
                                        if (youWin()) {
                                            getWinner(FirebaseAuth.getInstance().getUid(), wager);
                                            Log.i("FlipCoin", dataSnapshot.child(currentGameID).child("gameFinished").getValue().toString());
                                        } else {
                                            getLoser(FirebaseAuth.getInstance().getUid(), wager);

                                        }
                                    }
                                    endGame();
                                }
                            }
                        });
                    }

很抱歉,该方法中有很多草率的代码

但我有电话线在里面, if (dataSnapshot.child(currentGameID).child("gameFinished").getValue().equals(false)) {

这将检查游戏是否结束,如果没有结束,则在游戏结束时将找到赢家或输家

但是,一旦游戏结束,使用此方法找到赢家和输家,该方法就会循环并继续反复运行,因为它认为gameFinished等于false

我有一个endGame()方法,它发生在这个getResults()方法的末尾

    private void endGame() { HomePage.getCurrentGameID(new HomePage.CallbackID() {
        @Override
        public void onSuccess(final String currentGameID) {
            games.child(currentGameID).child("gameFinished").setValue(true);
            games.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                    Log.i("FlipCoin", dataSnapshot.child(currentGameID).child("gameFinished").getValue().toString());
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });
        }
    });
}

在这个方法中,我使用这一行清楚地将gameFinished设置为true games.child(currentGameID).child("gameFinished").setValue(true);

它反映在我的实时数据库中,看起来像这样

enter image description here

所以从视觉上看,这是真的。我的endgame()方法中还有一个log语句,返回true,因此根据log语句,布尔值应该为true

但是我的getResults()方法中也有log语句,该log返回false,即使布尔值显然是true

有人能帮我解决这个奇怪的问题吗

这显示了logcat是如何一次又一次地从false切换到true的,这没有任何意义

enter image description here


共 (2) 个答案

  1. # 1 楼答案

    出现此问题的原因是布尔值“gameFinished”默认初始化为false 在“gameFinished”设置为true后,需要检查getResults()方法

  2. # 2 楼答案

    您正在比较真值和假值。所以它返回false。像这样:

    true.equals(false)
    

    返回false

    将代码更改为以下代码行:

    if(dataSnapshot.child(currentGameID).child("gameFinished").getValue().equals(false))
    

    为此:

    if((Boolean)dataSnapshot.child(currentGameID).child("gameFinished").getValue())