2

ArrayIndexOutOfBoundsException を時折生成する Java (Android) のコードがあります。

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 で、2 回目の呼び出しでは 3 でしょうか?
  2. mCharacterModel.CharacterLevel()>= 0負の数を返している可能性があります-配列にインデックスを付ける前でもあることを確認するチェックを追加します。
  3. MessageModel.CharacterLevels複数のスレッドでアクセスされている可能性があり、長さチェックとアクセスの間で変更されているため、問題が発生しています。
于 2013-03-03T08:26:37.927 に答える
0

配列のインデックスは 0 から始まるので、次を使用することをお勧めします。

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

値が常に 1 以上の場合は、0 から始める必要があります。別の問題として、関数CharacterLevel()を 2 回呼び出して結果を使用しない方がよいでしょう。値をローカル変数に格納し、両方の場所で使用することをお勧めします。

于 2013-03-03T08:09:07.107 に答える
0
String characterLevel = mCharacterModel.CharacterLevel() >= MessageModel.CharacterLevels.length-1 ? "Hyperion Overlord" : MessageModel.CharacterLevels[mCharacterModel.CharacterLevel()];

これは機能するはずです。長さは 0 ベースではないため、長さに基づいて計算する場合は「-1」にする必要があります。

于 2013-03-03T08:07:39.363 に答える