向其他类的静态ArrayList添加字符串触发UnsupportedOperationException问题
解决静态ArrayList引发的UnsupportedOperationException问题
这种情况我之前踩过坑!核心问题出在你的静态ArrayList初始化方式不对——你大概率是用了Arrays.asList()来初始化,然后强制转成了ArrayList,但这个方法返回的其实是Arrays类内部的一个固定大小的列表实现,根本不是真正的java.util.ArrayList,所以调用add()、remove()这类修改操作时,就会直接抛出UnsupportedOperationException。
先看错误根源
举个典型的错误写法,如果你是这么定义静态类的:
public class MyGlobalList { // 错误:强制转换Arrays.asList的结果,实际是固定大小的内部类 public static ArrayList<String> myList = (ArrayList<String>) Arrays.asList("默认元素"); }
这种情况下,myList的实际类型是java.util.Arrays$ArrayList(Arrays的内部类),它不支持动态添加/删除元素,调用add()必然触发异常。
正确的解决方案
1. 初始化真正的ArrayList
直接创建java.util.ArrayList实例,或者把Arrays.asList()的结果包装成真正的ArrayList:
public class MyGlobalList { // 方式1:空列表初始化 public static ArrayList<String> myList = new ArrayList<>(); // 方式2:带初始元素的正确初始化 public static ArrayList<String> myList = new ArrayList<>(Arrays.asList("默认元素1", "默认元素2")); }
2. Activity中调用的正确姿势
在你的点击事件方法里,直接操作这个静态列表即可,不用再担心异常:
public void onAddItemClicked(View view) { try { MyGlobalList.myList.add("新添加的元素"); // 可以加个Toast提示操作成功 Toast.makeText(this, "元素添加成功", Toast.LENGTH_SHORT).show(); } catch (Exception e) { e.printStackTrace(); } }
关于捕获异常后仍有W/System.err日志的说明
你看到的W/System.err日志,其实是e.printStackTrace()打印出来的错误信息——这说明你捕获异常后只是打印了错误,但根本问题没解决,所以每次点击还是会触发异常并打印日志。只要把初始化方式改对,这个日志自然就消失了。
额外注意事项
- 如果你的App涉及多线程操作这个静态列表,记得做线程安全处理,比如用
Collections.synchronizedList(new ArrayList<>())或者CopyOnWriteArrayList - 别往这个静态列表里存
Activity、Context这类对象,很容易引发内存泄漏!
内容的提问来源于stack exchange,提问作者Nocab_Evol_1
相关产品推荐
相关产品推荐

