ホームページ >Java >&#&チュートリアル >配列インデックスが範囲外の例外です
恐ろしいArrayIndexOutOfBoundsException
に遭遇しましたか?このガイドではその原因を説明し、実用的な解決策を提供します。 このエラーをまだ経験したことがない場合でも、それを理解しておけば、将来デバッグで悩まされることがなくなります。
ArrayIndexOutOfBoundsException
は、コードが配列の有効範囲外のインデックスを使用して配列要素にアクセスしようとすると発生します。 Java (および他の多くの言語) では、配列インデックスは 0 から始まり、array.length - 1
まで拡張されます。 array.length
または負のインデックスにアクセスしようとすると、この例外がトリガーされます。
ケーススタディ: Java 並べ替えプログラム
ファイルから整数を読み取り、バブル ソートを使用して整数を並べ替え、並べ替えた結果を表示するように設計された Java プログラムについて考えてみましょう。 以下に示す元のコードは、ArrayIndexOutOfBoundsException
.
<code class="language-java">public static void main(String[] args) { // ... (File input code using Scanner) ... int [] nums = new int [(int) name.length()]; // Problem starts here! // ... (File reading code) ... for (int i = 0; i < nums.length -1; i++) { for (int j = 0; j < nums.length - 1; j++) { // Potential issue here if(nums[i] > nums[j + 1]) { int temp = nums[j+1]; nums[j+1] = nums[i]; nums[i] = temp; } } } // ... (Output code) ... }</code>
問題の根源
主な問題は、バブル ソート内のネストされたループにあります。 if(nums[i] > nums[j 1])
行には問題があります。 j
が nums.length - 1
に達すると、j 1
は nums.length
になり、無効なインデックスになります。
解決策: ループ境界の調整
修正には、j
が使用されているときに j 1
が最後のインデックスに到達しないように内部ループの条件を変更することが含まれます。 代わりに:
<code class="language-java">for (int j = 0; j < nums.length - 1; j++)</code>
使用:
<code class="language-java">for (int j = 0; j < nums.length - 1; j++) </code>
この微妙な変更により、nums[j 1]
が有効な最大値 (j
) にあるときにコードが nums.length - 2
にアクセスすることが確実に回避されます。
さらなる考慮事項
配列サイズ: 最初の配列宣言 int [] nums = new int [(int) name.length()];
にも潜在的に問題があります。 ファイル名の長さは、ファイル内の整数の数とは無関係です。 ファイルから読み取られた実際の整数の数に基づいて配列のサイズを動的に変更するか、ArrayList
.
エラー処理: 堅牢なコードには、ファイル入力中に try-catch
や FileNotFoundException
などの潜在的な例外を管理するためのエラー処理 (NumberFormatException
ブロックなど) が含まれています。
原因を理解し、提供された解決策を適用することで、プログラム内の ArrayIndexOutOfBoundsException
エラーを効果的に防止し、解決できます。 配列のサイズ設定を慎重に検討し、堅牢で信頼性の高いコードを実現するための包括的なエラー処理を組み込むことを忘れないでください。
以上が配列インデックスが範囲外の例外ですの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。