2

我在 Java (Android) 中有一段代码偶尔会生成 ArrayIndexOutOfBoundsException。

String characterLevel = mCharacterModel.CharacterLevel() >= 
        MessageModel.CharacterLevels.length ? "Hyperion Overlord" : 
        MessageModel.CharacterLevels[mCharacterModel.CharacterLevel()];

方法 mCharacterModel.CharacterLevel() 始终为 1 或更多。

MessageModel.CharacterLevels 数组定义如下,包含大约 50 个元素。

public static final String[] CharacterLevels = { "Title", "Title" };

问题的本质是如果超出数组的大小,则优雅地默认为另一个数据源。

我肯定错过了什么。这是将字符串设置为默认字符串的错误方法吗?

我已经在我能想到的所有地方寻找解决方案,但我担心我只是遗漏了上述逻辑中的一些基本缺陷。

任何帮助或建议表示赞赏。

4

3 回答 3

1

您的代码在逻辑上类似于以下内容:

int level = mCharacterModel.CharacterLevel();
String[] arr = MessageModel.CharacterLevels;
String characterLevel = level < arr.length ? 
        arr[level] : 
        "Hyperion Overlord";

如果它在界限内,它显然只会索引到数组中。我不同意关于-1数组索引修饰符的其他答案,因为您的逻辑检查应该防止级别对于数组来说太大。

我可以在您的原始代码(或我看不到的东西)中看到可能导致问题的唯一差异是(按可能性顺序):

  1. mCharacterModel.CharacterLevel()不止一次调用 - 如果后续调用发生变化,则可能是错误的来源。也许第一次调用是 1,第二次调用是 3?
  2. mCharacterModel.CharacterLevel()可能会返回一个负数 - 我会添加一个检查以确保它也在>= 0索引到数组之前。
  3. MessageModel.CharacterLevels可能是在多个线程上访问的东西,并且在长度检查和访问之间被修改,导致问题。
于 2013-03-03T08:26:37.927 回答
0
String characterLevel = mCharacterModel.CharacterLevel() >= MessageModel.CharacterLevels.length-1 ? "Hyperion Overlord" : MessageModel.CharacterLevels[mCharacterModel.CharacterLevel()];

这应该可行,长度不是基于 0 的,因此在基于长度计算时应该使用“-1”。

于 2013-03-03T08:07:39.363 回答
0

数组索引从 0 开始,因此您可能希望使用:

int index = mCharacterModel.CharacterLevel() - 1;
String characterLevel = index >= MessageModel.CharacterLevels.length ? "Hyperion Overlord" : MessageModel.CharacterLevels[index];

如果该值始终为 1 或更大,则需要从 0 开始。另一个问题 - 您最好不要调用该函数CharacterLevel()两次并使用结果。最好将值存储在局部变量中并在两个地方都使用它。

于 2013-03-03T08:09:07.107 回答