软件构造Lab2踩坑:ArrayList报错-UnsupportedOperationException的解决办法

本文解析了使用ArrayList时出现UnsupportedOperationException的原因,指出由Arrays.asList()创建的列表未实现add()方法,导致异常。

ArrayList报错:UnsupportedOperationException的解决办法

在软件构造Lab2实验时遇到一个问题:使用list.add()函数报出如下错误:
在这里插入图片描述

首先查看简化后的报错部分的代码:

在这里插入图片描述

逐级查看源码,首先查看Arrays.asList()函数:

    /**
     * Returns a fixed-size list backed by the specified array.  (Changes to
     * the returned list "write through" to the array.)  This method acts
     * as bridge between array-based and collection-based APIs, in
     * combination with {@link Collection#toArray}.  The returned list is
     * serializable and implements {@link RandomAccess}.
     *
     * <p>This method also provides a convenient way to create a fixed-size
     * list initialized to contain several elements:
     * <pre>
     *     List&lt;String&gt; stooges = Arrays.asList("Larry", "Moe", "Curly");
     * </pre>
     *
     * @param <T> the class of the objects in the array
     * @param a the array by which the list will be backed
     * @return a list view of the specified array
     */
    @SafeVarargs
    @SuppressWarnings("varargs")
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

可以看出返回的是Arrays私有的ArrayList类的列表,继承了AbstractList,据此继续查找,可以查找到此ArrayList定义的部分:

private static class ArrayList<E> extends AbstractList<E>

代码查找发现该类未重写add()方法,于是查看AbstractList中关于add()方法的定义:

    public boolean add(E e) {
        add(size(), e);
        return true;
    }

继续查找,发现abstractList对add()方法的定义为:

    /**
     * {@inheritDoc}
     *
     * <p>This implementation always throws an
     * {@code UnsupportedOperationException}.
     *
     * @throws UnsupportedOperationException {@inheritDoc}
     * @throws ClassCastException            {@inheritDoc}
     * @throws NullPointerException          {@inheritDoc}
     * @throws IllegalArgumentException      {@inheritDoc}
     * @throws IndexOutOfBoundsException     {@inheritDoc}
     */
    public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }

可以看出,Arrays.asList()返回的私有的ArrayList实际上并未实现add()方法,也就是其抛出UnsupportedOperationException的真正原因,但是定义部分的List是使用泛型接口定义的类,然而AbstractList的定义如下:

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> 

AbstractList实现了List,因此在会逃过静态代码审查的检测,我们正常情况下使用的ArrayList是java.util.ArrarList。实现了add()方法,因此可正常使用。

`java.lang.IndexOutOfBoundsException: Index: 3, Size: 2` 是一个索引越界异常,意味着程序试图访问一个集合(如数组、列表等)中不存在的索引位置。在这个错误中,集合的大小为 2,其有效索引范围是 0 到 1,但程序尝试访问索引为 3 的元素,从而引发异常。以下是一些可能的场景及对应的解决办法: #### 访问数组或列表元素时越界 当使用 `get()` 方法访问列表元素时,如果索引超出了列表的大小,就会抛出该异常。例如: ```java import java.util.ArrayList; import java.util.List; public class IndexOutOfBoundsExample { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("apple"); list.add("banana"); // 下面这行代码会抛出 IndexOutOfBoundsException // String element = list.get(3); // 解决办法:在访问元素之前检查索引是否合法 int index = 3; if (index >= 0 && index < list.size()) { String element = list.get(index); System.out.println(element); } else { System.out.println("索引超出范围"); } } } ``` #### MyBatis 查询结果处理时越界 在 MyBatis 中,如果在处理查询结果时,尝试访问结果集里不存在的索引,也会出现此异常。例如在映射结果时,可能会因为配置错误或逻辑问题导致索引越界。参考引用中提到 MyBatis 查询数据库时出现该异常 [^1][^2]。解决办法是检查 SQL 查询语句和结果映射配置,确保处理结果时不会访问越界的索引。 #### 循环遍历集合时越界 在使用 `for` 循环遍历集合时,如果循环条件设置不当,也可能导致索引越界。例如: ```java import java.util.ArrayList; import java.util.List; public class LoopIndexOutOfBoundsExample { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("apple"); list.add("banana"); // 错误的循环条件,会导致索引越界 // for (int i = 0; i <= list.size(); i++) { // System.out.println(list.get(i)); // } // 正确的循环条件 for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值