簡體   English   中英

數組索引超出界限異常Java游戲

[英]Array Index Out Of Bounds Exception Java Game

我正在用Java創建游戲,並嘗試為其創建多人游戲,當游戲首次啟動時,加載關卡並將客戶端添加到客戶端的播放器列表中,客戶端將遍歷該列表並如果服務器告訴它,則添加更多內容,但問題是,當游戲首次啟動時,我會收到“ ArrayIndexOutOfBoundsException”,我已指示游戲忽略它,似乎無法解決問題。

我假設這與創建新播放器以及線程完成工作所需的時間有關,但希望有人能提供幫助!

消息var是從服務器接收的字符串,其格式如下:

名稱;地址; posX; posY; fakeRotation;旋轉;旋轉速度;速度; sheildEnabled; sheildHealth;健康

這是服務器發送的示例:

Luke;/127.0.0.1:53701;50.0;50.0;0.0;0.0;0.0;0.0;true;100;100

這里是變量:

String[] decrypted = message.split(",");
String[] commands = decrypted[x].split(";");

這是令我困擾的代碼:

 boolean newPlayer = true;
        if(Main.level.playerList != null)
        {
            try
            {
                for(int p = 0; p < Main.level.playerList.size(); p++)
                {
                    if(Main.level.playerList.get(p).address.toString().equals(commands[1]))
                    {
                        newPlayer = false;
                        break;
                    }
                }

                if(newPlayer)
                {
                    Player player = new Player(50, 50, 100, 150, commands[1], Main.level.shipImage1, Main.level.thrusterFlamesSprite1, Main.level.shieldSprite1);
                    Main.level.playerList.add(player);
                }

                for(int p = 0; p < Main.level.playerList.size(); p++)
                {
                    Player player = Main.level.playerList.get(p);

                    if(player.address.equals(commands[1]))
                    {
                        // name:address:posX:posY:fakeRotation:rotation:rotationSpeed:speed:sheildEnabled:sheildHealth:health
                        player.name = commands[0];
                        player.address = commands[1];
                        player.pos[0] = Double.parseDouble(commands[2]);
                        player.pos[1] = Double.parseDouble(commands[3]);
                        player.fakeRotation = Float.parseFloat(commands[4]);
                        player.rotation = Float.parseFloat(commands[5]);
                        player.rotationSpeed = Double.parseDouble(commands[6]);
                        player.speed = Double.parseDouble(commands[7]);
                        player.sheildEnabled = Boolean.parseBoolean(commands[8]);
                        player.sheildStrength = Integer.parseInt(commands[9]);
                        //player.health = Integer.parseInt(commands[10]);
                    }
                }
            }
            catch(ArrayIndexOutOfBoundsException e)
            {
                System.out.println("Array index out of bounds, continuing.");

                e.printStackTrace();
            }
        }

希望有人能提供幫助,就像我說的那樣,我認為添加一個“新”項目是一件好事,但我找不到任何使它起作用的方法!

我收到的堆棧跟蹤是:

java.lang.ArrayIndexOutOfBoundsException: 1
at multiplayer.Translator.interperate(Translator.java:28)
at multiplayer.GameClient.run(GameClient.java:81)

提前致謝!

根據堆棧跟蹤,錯誤是否在health線上發生? 如果是這樣,decrypted [x]中可能沒有足夠的分號。

編輯-

  String[] commands = decrypted[x].split(";");

那么, x是多少? 當您查看所有decrypted[x] ,您是否看到了期望? 這個值是您之前發布的“ Luke”數據嗎?

編輯-同樣,我建議您用static final常量替換pos[0]pos[1]的0和1:

  private static final int X_COORD = 0;
  private static final int Y_COORD = 1;
  /* ... snip ... */
  player.pos[X_COORD] = Double.parseDouble(commands[2]);
  player.pos[Y_COORD] = Double.parseDouble(commands[3]);

這樣做的目的是使您的代碼可以通過描述性常數而不是數字來引用X和Y坐標。 雖然現在您知道0和1的含義,但是從現在起的幾個月后您將不知道,而回頭看一下他的代碼,您會感到困惑或困惑。 添加常數意味着您不必記住。 它還將幫助您發現錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM