在Java中传递引用 [英] Passing a reference in Java

查看:117
本文介绍了在Java中传递引用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这个纸牌游戏,我将所有玩家存储在列表中。
要找出我想与谁合作的玩家,每位玩家都有(我可以获得卡名),名字(我可以获得玩家的名字),但要是唯一的,每个玩家都有 ID

I've this cards game, in which I store all the players in a List. To find out who's the player I want to act with, each player has a Card (I can get the card name), a name (I can get the player's name), but to be unique each player has an ID.

现在,在我的 onCreate()方法的开头,我找到并将列表的播放器分配给播放器,玩家 clairvoyant

Now, at the beginning of my onCreate() method, I find, and assign a player of the list to a Player, Player clairvoyant:

public void initializeCharacters() {
    for (Player player : players) {
        if (player.getCardName().equals("Clairvoyant")) {
            clairvoyant = player;
        }
}






游戏在夜晚和白天之间切换。透视力的转折是在夜间,我用一个开关确定何时轮到谁。


The game switch between Night and Day. The Clairvoyant's turn is during the night, and I used a switch to determine when's who's turn.

现在,在启动透视力之前,我会检查他是否还活着,在否定的情况下,我只是跳过他的回合:

Now, before starting the Clairvoyant's turn, I check if he's alive or not, in negative case, I simply skip his turn:

case 2:
                    clairvoyant(); // Clairvoyant's turn
                    Toast.makeText(Game.this, String.valueOf(clairvoyant.getLifeStatus()), Toast.LENGTH_SHORT).show();
                    if(clairvoyant.getLifeStatus()) {
                    /* --- Let him choose ---*/
                        Intent intent = new Intent(this, ListPlayersClairvoyant.class);
                        Bundle bundle = new Bundle();
                        bundle.putSerializable("PLAYERS", (Serializable) players);
                        intent.putExtras(bundle);
                        startActivityForResult(intent, REQUEST_CLAIRVOYANT);
                    /* --------------------- */
                    }
                    nightInsideCounter++;
                    if(medium == null) {
                        nightInsideCounter++;
                    }
                    if(guard == null) {
                        nightInsideCounter++;
                    }
                    break;

然而,我添加了Toasts,看看我什么时候杀死玩家,如果他们还活着,但即使在列表中搜索到的玩家被杀死,先前创建的千里眼玩家也不会。


所以基本上,列表中的玩家使用透视卡已经死了;但透视球员,在开始轮到他之前初步确定参考,仍然活着

And yet, I've added Toasts to see when I kill players if they're still alive, but even if the Player searched in the list is killed, the Clairvoyant player, previously created isn't.
So basically, the player in the list with the clairvoyant card, is dead; but the clairvoyant player, initialized before to have a reference to it before starting his turn, is still alive!

我不明白为什么。有什么我想念的吗?那是我做过参考吗?在这种情况下,我该如何创建对它的引用?

I don't understand why. Is anything I'm missing? Is that I've done a reference or not? In this case, how should I create a reference to it?

编辑:

现在一切正常,我已经在播放器类和卡片上实现了Parcelable接口。
问题是当我从ListPlayersVote Activity到第一个游戏(主要游戏)的意图时,应用程序崩溃并且我收到此错误:

Now it all works fine, I have implemented the Parcelable interface on the Player Class and on the Card one too. The problem is when I get to the intent from ListPlayersVote Activity to the Game one (the main one), the App crashes and I get this error:


java.lang.NullPointerException:尝试在android.widget.ArrayAdapter上的空对象引用
上调用虚方法'java.lang.String java.lang.Object.toString()'。 createViewFromResource(ArrayAdapter.java:401)

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:401)

[...] //许多其他链接,跳过

[...] // Many other links, skipped

这是一个简单的NullPointer异常,但我没有链接到我的错误代码,而是我得到了其他脚本的所有其他链接(可能已经制作,而不是我)这让我陷入困境,如果我没有得到任何链接到我的代码,我想如何修复错误?

Which is a simple NullPointer exception, but I get no links to my code for the error, instead I get all other links to other scripts (Probably already made, not by me) and this keeps me stuck, how am I suppose to fix the bug if I don't get any link to my code?

投票活动

播放器类

如何检索传递的ArrayLists ,并检查它们的值(这是一个StartActivityForResult()):

How I retrieve the ArrayLists passed, and check for their values (this is a StartActivityForResult() ):

    /* ------------------------------------------ */
    /* ---------- If they want to VOTE ---------- */
    /* ------------------------------------------ */
    if(requestCode == REQUEST_VOTE) {

        if(resultCode == Activity.RESULT_OK) {
            // Get the Player clicked
            ArrayList<Player> highestList = data.getParcelableArrayListExtra("HIGHEST");
            ArrayList<Player> highestList1 = data.getParcelableArrayListExtra("HIGHEST1");
            System.out.println("[5] The players of the first list are " + highestList.size() + ".");
            System.out.println("[6] The players of the second list are " + highestList1.size() + ".");

            // Add the most voted players to a signle List, highest
                highest.addAll(highestList);
                highestList.clear();

                highest.addAll(highestList1);
                highestList1.clear();

            // Write the names in chat
            write("Il villaggio ha i propri sospettati:");
            for (Player player : highest){
                write(player.getName());
            }
            System.out.println("[7] The players chosen are " + highest.size() + ".");
            highest.clear();

        } else if (resultCode == Activity.RESULT_CANCELED) {
            // Some stuff that will happen if there's no result
        }

    }


推荐答案


问题出在我身边从ListPlayersVote Activity
到Game one(主要的)获取意图,App崩溃并且我收到此错误:

The problem is when I get to the intent from ListPlayersVote Activity to the Game one (the main one), the App crashes and I get this error:

正如我在评论中所说,当适配器与其中包含空值的数据列表一起使用时,会发生与 ArrayAdapter 类相关的异常。查看您的代码,罪魁祸首似乎是一个Player对象,它没有在 ListPlayersVote 类中初始化其字段。在该类中,您当前的代码几乎总是会引入非初始化的Player对象引用。在 ListPlayersVote onCreate()回调中,您首先将两个Player对象添加到持有者列表中,我假设作为进一步计算的基础:

As I said in my comment, that exception related to the ArrayAdapter class happens when the adapter is used with a list of data that has null values in it. Looking through your code the culprit seems to be a Player object that doesn't have its fields initialized in the ListPlayersVote class. In that class, your current code will almost always introduce that non initialized Player object reference. In the ListPlayersVote's onCreate() callback you first add two Player objects to the holder lists, I'm assuming to have as a base for further calculations:

// remove the lines below , there's no need for them
// also simply doing new Player() will result in a Player which doesn't have    
// its fields initialized(and you don't update them later either)
highestList.add(new Player()); // is there a reason for adding this empty players?
highestList1.add(new Player());

然后在onEntryClick()回调中更新您的代码以正确处理玩家投票的计数:

Then in the onEntryClick() callback update your code to properly handle counting the players votes:

for (Player player1 : players){ // For each player
  // first of all you need to move the initialization for highest and highest1 INSIDE the
  // for loop to use the proper highest values at each iteration
  // With your current code the lists highestlist and highestlis1 each have
  // ONE Player object which is empty (because in the default constructor 
  // of Player you do nothing), you then use the empty initial Player in each list to
  // compare the vote count, this will mostly result in the first if  
  // clause(playerCount > highest) being triggered,
  // which will add the initial empty Player object to highestlist1
  int highest = highestList.size() == 0 ? -1 : highestList.get(0).getCount();// if the list is empty initialize it with -1 to signal the first player handled
  int highest1 = highestList1.size() == 0 ? -1 : highestList1.get(0).getCount();

  int playerCount = player1.getCount(); // Get his votes

    // you need to check for -1 to handle the case when you're dealing 
    // with the first player( which of course will have the highest 
    // count as there's no either player to compare it yet)
    if(playerCount > highest || highest == -1){ // If they're the highest so far, add it to the 1st list
        highestList1.addAll(highestList);
        highestList.clear();
        highestList.add(player1);
        // the same for highest1
    } else if (playerCount > highest1 || highest1 == -1){ // If they're the 2nd highest so far, add it to the 2nd list
        highestList1.clear();
        highestList1.add(player1);
    }else if(playerCount == highest){ // If they're equal to the current highest one, add it to the 1st list as well
        highestList1.add(player1);
    } else if (playerCount == highest1){ // If they're equal to the current 2nd highest one, add it to the 2nd list as well
        highestList1.add(player1);
    }

这篇关于在Java中传递引用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆