gpt4 book ai didi

java - 为什么这段代码会产生 ArrayIndexOutOfBoundsException?

转载 作者:行者123 更新时间:2023-11-30 11:35:18 25 4
gpt4 key购买 nike

我在 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"};

问题的本质是关于在超出数组大小的情况下优雅地默认为另一个数据源。

我一定是遗漏了什么。这是将字符串设置为默认字符串的不正确方法吗?

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

感谢任何帮助或建议。

最佳答案

您的代码看起来在逻辑上等同于以下内容:

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 可能是在多个线程上访问的东西,它在长度检查和访问之间被修改,导致了问题。

关于java - 为什么这段代码会产生 ArrayIndexOutOfBoundsException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15183699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com