天天看點

java.lang.UnsupportedOperationException解決方法前言:正文: 總結:

前言:

在工作中我們會經常操作集合,有的時候會碰到程式抛出标題中提到的異常,這個翻譯過來就很好了解,不支援操作的異常。但是你會很納悶,明明自己操作的是集合的add方法,難道集合還不支援追加元素了?

那是因為此集合非彼集合。

正文:

我們還是先複現問題,在分析問題,最後解決問題。

1.複現問題

public class Demo34 {
    public static void main(String[] args) {
        String[] array = {"1","2","3","4","5"};
        List<String> list = Arrays.asList(array);
        list.add("6");
    }
}
           

運作結果:

"C:\Program Files\Java\jdk1.8.0_101\bin\java.exe" "-javaagent:D:\idea\IntelliJ IDEA 2019.2.3\lib\idea_rt.jar=58871:D:\idea\IntelliJ IDEA 2019.2.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_101\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_101\jre\lib\rt.jar;F:\tower\springboot_jsp\target\classes;G:\repo\org\springframework\boot\spring-boot-starter\2.1.1.RELEASE\spring-boot-starter-2.1.1.RELEASE.jar;G:\repo\org\springframework\boot\spring-boot\2.1.1.RELEASE\spring-boot-2.1.1.RELEASE.jar;G:\repo\org\springframework\spring-context\5.1.3.RELEASE\spring-context-5.1.3.RELEASE.jar;G:\repo\org\springframework\boot\spring-boot-autoconfigure\2.1.1.RELEASE\spring-boot-autoconfigure-2.1.1.RELEASE.jar;G:\repo\org\springframework\boot\spring-boot-starter-logging\2.1.1.RELEASE\spring-boot-starter-logging-2.1.1.RELEASE.jar;G:\repo\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;G:\repo\org\apache\logging\log4j\log4j-to-slf4j\2.11.1\log4j-to-slf4j-2.11.1.jar;G:\repo\org\apache\logging\log4j\log4j-api\2.11.1\log4j-api-2.11.1.jar;G:\repo\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-1.7.25.jar;G:\repo\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;G:\repo\org\springframework\spring-core\5.1.3.RELEASE\spring-core-5.1.3.RELEASE.jar;G:\repo\org\springframework\spring-jcl\5.1.3.RELEASE\spring-jcl-5.1.3.RELEASE.jar;G:\repo\org\yaml\snakeyaml\1.23\snakeyaml-1.23.jar;G:\repo\org\springframework\boot\spring-boot-starter-web\2.4.2\spring-boot-starter-web-2.4.2.jar;G:\repo\org\springframework\boot\spring-boot-starter-json\2.1.1.RELEASE\spring-boot-starter-json-2.1.1.RELEASE.jar;G:\repo\com\fasterxml\jackson\core\jackson-databind\2.9.7\jackson-databind-2.9.7.jar;G:\repo\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;G:\repo\com\fasterxml\jackson\core\jackson-core\2.9.7\jackson-core-2.9.7.jar;G:\repo\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.7\jackson-datatype-jdk8-2.9.7.jar;G:\repo\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.9.7\jackson-datatype-jsr310-2.9.7.jar;G:\repo\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.7\jackson-module-parameter-names-2.9.7.jar;G:\repo\org\springframework\boot\spring-boot-starter-tomcat\2.1.1.RELEASE\spring-boot-starter-tomcat-2.1.1.RELEASE.jar;G:\repo\org\apache\tomcat\embed\tomcat-embed-core\9.0.13\tomcat-embed-core-9.0.13.jar;G:\repo\org\apache\tomcat\embed\tomcat-embed-el\9.0.13\tomcat-embed-el-9.0.13.jar;G:\repo\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.13\tomcat-embed-websocket-9.0.13.jar;G:\repo\org\springframework\spring-web\5.1.3.RELEASE\spring-web-5.1.3.RELEASE.jar;G:\repo\org\springframework\spring-beans\5.1.3.RELEASE\spring-beans-5.1.3.RELEASE.jar;G:\repo\org\springframework\spring-webmvc\5.1.3.RELEASE\spring-webmvc-5.1.3.RELEASE.jar;G:\repo\org\springframework\spring-aop\5.1.3.RELEASE\spring-aop-5.1.3.RELEASE.jar;G:\repo\org\springframework\spring-expression\5.1.3.RELEASE\spring-expression-5.1.3.RELEASE.jar;G:\repo\com\baomidou\mybatis-plus-boot-starter\3.1.0\mybatis-plus-boot-starter-3.1.0.jar;G:\repo\com\baomidou\mybatis-plus\3.1.0\mybatis-plus-3.1.0.jar;G:\repo\org\springframework\boot\spring-boot-starter-jdbc\2.1.1.RELEASE\spring-boot-starter-jdbc-2.1.1.RELEASE.jar;G:\repo\com\zaxxer\HikariCP\3.2.0\HikariCP-3.2.0.jar;G:\repo\org\springframework\spring-jdbc\5.1.3.RELEASE\spring-jdbc-5.1.3.RELEASE.jar;G:\repo\com\alibaba\druid\1.1.6\druid-1.1.6.jar;G:\repo\mysql\mysql-connector-java\5.1.47\mysql-connector-java-5.1.47.jar;G:\repo\com\baomidou\mybatis-plus-generator\3.1.1\mybatis-plus-generator-3.1.1.jar;G:\repo\com\baomidou\mybatis-plus-extension\3.1.1\mybatis-plus-extension-3.1.1.jar;G:\repo\com\baomidou\mybatis-plus-core\3.1.1\mybatis-plus-core-3.1.1.jar;G:\repo\com\baomidou\mybatis-plus-annotation\3.1.1\mybatis-plus-annotation-3.1.1.jar;G:\repo\com\github\jsqlparser\jsqlparser\1.2\jsqlparser-1.2.jar;G:\repo\org\mybatis\mybatis\3.5.1\mybatis-3.5.1.jar;G:\repo\org\mybatis\mybatis-spring\2.0.1\mybatis-spring-2.0.1.jar;G:\repo\org\apache\velocity\velocity-engine-core\2.1\velocity-engine-core-2.1.jar;G:\repo\org\apache\commons\commons-lang3\3.8.1\commons-lang3-3.8.1.jar;G:\repo\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;G:\repo\org\apache\activemq\activemq-all\5.15.8\activemq-all-5.15.8.jar;G:\repo\org\jxls\jxls\2.6.0\jxls-2.6.0.jar;G:\repo\org\apache\commons\commons-jexl3\3.1\commons-jexl3-3.1.jar;G:\repo\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;G:\repo\commons-beanutils\commons-beanutils\1.9.3\commons-beanutils-1.9.3.jar;G:\repo\commons-collections\commons-collections\3.2.2\commons-collections-3.2.2.jar;G:\repo\org\slf4j\jcl-over-slf4j\1.7.25\jcl-over-slf4j-1.7.25.jar;G:\repo\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;G:\repo\org\jxls\jxls-poi\1.2.0\jxls-poi-1.2.0.jar;G:\repo\org\apache\poi\poi\4.0.1\poi-4.0.1.jar;G:\repo\commons-codec\commons-codec\1.11\commons-codec-1.11.jar;G:\repo\org\apache\commons\commons-collections4\4.2\commons-collections4-4.2.jar;G:\repo\org\apache\commons\commons-math3\3.6.1\commons-math3-3.6.1.jar;G:\repo\org\apache\poi\poi-ooxml\4.0.1\poi-ooxml-4.0.1.jar;G:\repo\org\apache\poi\poi-ooxml-schemas\4.0.1\poi-ooxml-schemas-4.0.1.jar;G:\repo\org\apache\xmlbeans\xmlbeans\3.0.2\xmlbeans-3.0.2.jar;G:\repo\org\apache\commons\commons-compress\1.18\commons-compress-1.18.jar;G:\repo\com\github\virtuald\curvesapi\1.05\curvesapi-1.05.jar;G:\repo\org\jxls\jxls-jexcel\1.0.8\jxls-jexcel-1.0.8.jar;G:\repo\net\sourceforge\jexcelapi\jxl\2.6.10\jxl-2.6.10.jar;G:\repo\log4j\log4j\1.2.14\log4j-1.2.14.jar;G:\repo\org\apache\commons\commons-jexl\2.1.1\commons-jexl-2.1.1.jar;G:\repo\org\jxls\jxls-reader\2.0.5\jxls-reader-2.0.5.jar;G:\repo\org\apache\commons\commons-digester3\3.2\commons-digester3-3.2-with-deps.jar;G:\repo\cglib\cglib\2.2.2\cglib-2.2.2.jar;G:\repo\asm\asm\3.3.1\asm-3.3.1.jar;G:\repo\com\alibaba\fastjson\1.2.47\fastjson-1.2.47.jar;G:\repo\org\springframework\boot\spring-boot-starter-data-mongodb\2.1.1.RELEASE\spring-boot-starter-data-mongodb-2.1.1.RELEASE.jar;G:\repo\org\mongodb\mongodb-driver\3.8.2\mongodb-driver-3.8.2.jar;G:\repo\org\mongodb\bson\3.8.2\bson-3.8.2.jar;G:\repo\org\mongodb\mongodb-driver-core\3.8.2\mongodb-driver-core-3.8.2.jar;G:\repo\org\springframework\data\spring-data-mongodb\2.1.3.RELEASE\spring-data-mongodb-2.1.3.RELEASE.jar;G:\repo\org\springframework\spring-tx\5.1.3.RELEASE\spring-tx-5.1.3.RELEASE.jar;G:\repo\org\springframework\data\spring-data-commons\2.1.3.RELEASE\spring-data-commons-2.1.3.RELEASE.jar;G:\repo\joda-time\joda-time\2.9.1\joda-time-2.9.1.jar;G:\repo\org\jodd\jodd-http\3.7.1\jodd-http-3.7.1.jar;G:\repo\org\jodd\jodd-core\3.7.1\jodd-core-3.7.1.jar;G:\repo\org\jodd\jodd-upload\3.7.1\jodd-upload-3.7.1.jar;G:\repo\org\assertj\assertj-core\3.11.1\assertj-core-3.11.1.jar" com.dada.springboot_jsp.study.controller.Demo34
Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.AbstractList.add(AbstractList.java:148)
	at java.util.AbstractList.add(AbstractList.java:108)
	at com.dada.springboot_jsp.study.controller.Demo34.main(Demo34.java:15)

Process finished with exit code 1
           

2.分析問題

我們隻能帶着疑問去看下源碼了(asList和new 的ArrayList有什麼差別啊)

java.lang.UnsupportedOperationException解決方法前言:正文: 總結:

 我們可以看出Arrays的asList方法傳回的是Arrays的内部類ArrayList,它并不是java.util.ArrayList,隻不過它們的父類都是AbstractList。

而我們可以看到Arrays的内部類ArrayList并沒有重寫add和remove方法,是以當我調用Arrays的内部類ArrayList的add方法時實際上是內建父類AbstractList的add方法。

我們再看下AbstractList的add方法幹了什麼:

java.lang.UnsupportedOperationException解決方法前言:正文: 總結:

 是以就會抛出異常了。

然而java.util.ArrayList的add方法重寫了父類的方法,是以不會報錯。

java.lang.UnsupportedOperationException解決方法前言:正文: 總結:

3.解決辦法

對Arrays的内部類ArrayList包一層,這樣就不報錯啦!

java.lang.UnsupportedOperationException解決方法前言:正文: 總結:

 總結:

分享最近喜歡的一句話:

生活就是一個遊樂場,要不然就坐過山車,享受那種驚險刺激,頭暈目眩的感覺尖叫,要不就坐旋轉木馬,一圈圈的周而複始。

我是阿達,一名喜歡分享知識的程式員,時不時的也會荒腔走闆的聊一聊電影、電視劇、音樂、漫畫,這裡已經有22354位小夥伴在等你們啦,感興趣的就趕緊來點選關注我把,哪裡有不明白或有不同觀點的地方歡迎留言!