首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数组索引越界异常Java游戏

数组索引越界异常Java游戏
EN

Stack Overflow用户
提问于 2012-06-03 20:42:51
回答 1查看 1.8K关注 0票数 0

我正在用java创建一个游戏,我试图为它创建一个多人游戏,当游戏第一次开始时,关卡被加载,客户端被添加到客户端的播放列表中,客户端将迭代列表并添加更多,如果服务器告诉它,但问题是当游戏第一次开始时,我得到了'ArrayIndexOutOfBoundsException‘,我已经指示我的游戏忽略它,我似乎找不到问题。

我假设这与创建新的播放器和线程做他们的工作所需的时间有关,但我希望有人能帮助他们!

message var是从服务器接收的字符串,格式如下:

name;address;posX;posY;fakeRotation;rotation;rotationSpeed;speed;sheildEnabled;sheildHealth;health

以下是服务器发送的内容的示例:

代码语言:javascript
运行
复制
Luke;/127.0.0.1:53701;50.0;50.0;0.0;0.0;0.0;0.0;true;100;100

以下是var:

代码语言:javascript
运行
复制
String[] decrypted = message.split(",");
String[] commands = decrypted[x].split(";");

下面是困扰我的一段代码:

代码语言:javascript
运行
复制
 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();
            }
        }

希望有人能帮上忙,就像我说过的那样,我认为这与添加一个“新”项目有关,但我找不到任何方法来让它工作!

我收到的堆栈跟踪是:

代码语言:javascript
运行
复制
java.lang.ArrayIndexOutOfBoundsException: 1
at multiplayer.Translator.interperate(Translator.java:28)
at multiplayer.GameClient.run(GameClient.java:81)

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-03 20:56:19

根据堆栈跟踪,错误是否发生在health行?如果是这样,则decryptedx中可能没有足够的分号。

编辑-

代码语言:javascript
运行
复制
  String[] commands = decrypted[x].split(";");

那么,什么是x呢?当你查看所有的decrypted[x]时,你会看到你所期望的吗?这个值就是你之前发布的'Luke‘数据吗?

编辑-另外,我建议您将pos[0]pos[1]中的0和1替换为static final常量:

代码语言:javascript
运行
复制
  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是什么意思,但几个月后你就不会知道了,当你回顾他的代码时,你会感到困惑或困惑。添加常量意味着您不必记住。它还将帮助您发现错误。

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

https://stackoverflow.com/questions/10870404

复制
相关文章

相似问题

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