1. 概要

ArrayStoreException は、Java の実行時に、オブジェクトの配列に誤ったタイプのオブジェクトを格納しようとするとスローされます。 ArrayStoreException 未チェックの例外であるため、それを処理または宣言することは一般的ではありません。

このチュートリアルでは、 ArrayStoreException の原因、その処理方法、およびそれを回避するためのベストプラクティスを示します。

2. ArrayStoreExceptionの原因

宣言されたタイプではなく、異なるタイプのオブジェクトを配列に格納しようとすると、JavaはArrayStoreExceptionをスローします。

String タイプの配列をインスタンス化し、後でIntegerを格納しようとしたとします。 この場合、実行時にArrayStoreExceptionがスローされます。

Object array[] = new String[5];
array[0] = 2;

配列に誤った値型を格納しようとすると、コードの2行目に例外がスローされます。

Exception in thread "main" java.lang.ArrayStoreException: java.lang.Integer
    at com.baeldung.array.arraystoreexception.ArrayStoreExceptionExample.main(ArrayStoreExceptionExample.java:9)

arrayObjectとして宣言したため、のコンパイルにエラーはありません

3. ArrayStoreExceptionの処理

この例外の処理は非常に簡単です。 他の例外と同様に、次の処理を行うには、をtry-catchブロックで囲む必要があります。

try{
    Object array[] = new String[5];
    array[0] = 2;
}
catch (ArrayStoreException e) {
    // handle the exception
}

4. この例外を回避するためのベストプラクティス

Object ではなく、StringやIntegerなどの特定のクラスとして配列型を宣言することをすることをお勧めします。 配列型をObject、として宣言すると、コンパイラーはエラーをスローしません。

ただし、配列を基本クラスで宣言してから、別のクラスのオブジェクトを格納すると、コンパイルエラーが発生します。 簡単な例でこれを見てみましょう:

String array[] = new String[5];
array[0] = 2;

上記の例では、配列型を String として宣言し、Integerを格納しようとしています。 これにより、コンパイルエラーが発生します。

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
  Type mismatch: cannot convert from int to String
    at com.baeldung.arraystoreexception.ArrayStoreExampleCE.main(ArrayStoreExampleCE.java:8)

実行時よりもコンパイル時にエラーをキャッチした方が良いです。前者をより細かく制御できるからです。

5. 結論

このチュートリアルでは、Javaでの ArrayStoreException の原因、処理、および防止について学習しました。

完全な例は、GitHubから入手できます。