建設(shè)工程發(fā)布公告的網(wǎng)站人力資源管理師
java.lang.UnsupportedOperationException解決方法
- 先放錯(cuò)誤信息
- 業(yè)務(wù)場景
- 報(bào)錯(cuò)分析
- 先看報(bào)錯(cuò)代碼位置
- 進(jìn)入源碼查看
- 至此 真相大白
- 解決方法
- 總結(jié)
先放錯(cuò)誤信息
業(yè)務(wù)場景
已知有學(xué)生 張三李四王五趙六 等人
private List<String> nameList = Arrays.asList("張三", "李四", "王五", "趙六");
現(xiàn)有一名考生 如考試分?jǐn)?shù)大于等于80分 即編入該班級(jí)
if (score >= 80) { nameList.add("七七"); }
報(bào)錯(cuò)分析
先看報(bào)錯(cuò)代碼位置
在類 MainActivity 中的第32行代碼,OK,咱們進(jìn)入源碼查看
進(jìn)入源碼查看
先看 Arrays.asList 方法,可以看到這里返回值是new了一個(gè) ArrayList ,但此 ArrayList 是Arrays類本身的內(nèi)部類,通過查找發(fā)現(xiàn)此類中并沒有add方法,那么咱們可以看到此 ArrayList 類繼承了 AbstractList ,咱們進(jìn)入 AbstractList 類查看即可找到原因
通過查找發(fā)現(xiàn)此類中并沒有add方法
進(jìn)入 AbstractList 類查看,可以看到該方法會(huì)拋此異常
至此 真相大白
此時(shí)咱們進(jìn)入 ArrayList 源碼中查看,可以看出是重寫了add方法,至此 真相大白
解決方法
既然已知原因,只需類型轉(zhuǎn)換即可
private List<String> nameList = new ArrayList<>(Arrays.asList("張三","李四","王五","趙六"));
總結(jié)
- 在使用 Arrays.asList() 方法生成的 List 中的 add()、remove() 等方法時(shí)運(yùn)行報(bào)異常,這是由于 Arrays.asList() 返回的是 Arrays 本身的內(nèi)部ArrayList類,而不是 java.util.ArrayList 類。
- Arrays 的內(nèi)部類 ArrayList 和 java.util.ArrayList 雖然都是繼承 AbstractList,但 java.util.ArrayList 重寫了這些方法而 Arrays 的內(nèi)部ArrayList 類沒有重寫這些方法,所以會(huì)拋出異常。