Java报错”ArrayStoreException”的原因以及解决办法

  • Post category:Java

关于Java中的 ArrayStoreException,它是一种运行时异常,表示尝试向数组中存储不兼容的对象类型。通俗的说,就是把一个类型不匹配的元素添加到数组中导致的异常。

这种异常通常出现在数组中存储了多种类型的元素的时候,例如一个定义了 String 类型的数组,你试图把 Integer 类型的元素添加进去,这时就会产生 ArrayStoreException 异常。

解决这种异常的主要方法是,确保你往数组中添加的元素类型和数组本身类型一致,或者使用泛型来确保数据类型一致。

下面是两个示例,分别说明该异常的原因及解决办法。

示例一:

public static void main(String[] args) {
    String[] strs = new String[5];
    Object[] objs = strs; //利用数组的协变性,将Object类型数组引用指向String类型数组
    objs[0] = new Object(); //这里插入一个Object类型的元素,与原来的String类型不一致,会抛出ArrayStoreException异常
}

在这个示例中,我们定义了一个 String 类型的数组 strs,然后我们把 objs 引用指向 strs,再往 objs 中插入了一个 Object 类型的元素,这个操作就会导致 ArrayStoreException 异常,因为试图往 String[] 中添加 Object 类型的元素。

解决这个问题的方法是,定义一个通用类型,采用泛型实现:

public static void main(String[] args) {
    ArrayList<String> strs = new ArrayList<String>();
    List<Object> objs = strs; //这里引用指向的是Object类型的ArrayList
    objs.add(new Object()); //这里再添加Object类型元素就不会报错了
}

这里的 objs 是一个 Object 类型的 ArrayList,但由于该 ArrayList 是基于泛型实现的,我们可以在定义泛型的时候指定其类型为 String,这样就避免了插入类型不匹配的元素。

示例二:

public static void main(String[] args) {
    Object[] objs = new Object[5];
    Integer i = new Integer(10);
    objs[0] = i; //往objs数组里面添加一个整型类型的元素
    String s = (String) objs[0]; //试图把Object类型的元素转为String类型,抛出ArrayStoreException异常
}

在这个示例中,我们定义了一个 Object 类型的数组 objs,往里面添加了一个 Integer 类型的元素 i,然后试图将 objs 中的元素转换成 String 类型,这时会抛出 ArrayStoreException 异常,因为 Integer 与 String 类型不匹配。

解决这个问题的方法是,使用合适的数据类型:

public static void main(String[] args) {
    Integer[] ints = new Integer[5];
    Integer i = new Integer(10);
    ints[0] = i; //往ints数组里面添加一个整型类型的元素
    String s = (String) ints[0]; //试图把Integer类型的元素转为String类型,会在运行时抛出类型转换异常
}

这里的 ints 是一个 Integer 类型的数组,往里面添加 Integer 类型的元素之后,就不存在类型不匹配的问题了。如果试图将其转换为 String 类型,那么在运行时就会抛出类型转换异常,而不是 ArrayStoreException 异常。