2015-10-04 1 views
0

Вот код, который бросает исключение на subList.clear strList5 (в) призывании:Java 8 UnsupportedOperationException на subList.clear()

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

public static List<String> removeRange(List<String> strList, int   maxElementsToBeAllowedInList) { 
    if (strList.size() > maxElementsToBeAllowedInList) { 
     System.out.println("Clearing out sublist: [" 
       + strList.subList(maxElementsToBeAllowedInList, strList.size()) + "]"); 
     strList.subList(maxElementsToBeAllowedInList, strList.size()).clear(); 
    } 
    return strList; 
} 

public static void main(String[] args) { 
    List<String> strList1 = new ArrayList<>(); 
    List<String> strList2 = Arrays.asList("one", "two", "three"); 
    List<String> strList3 = Arrays.asList("one", "two", "three", "four", "five"); 
    List<String> strList4 = Arrays.asList("one", "two", "three", "four", "five", "six"); 
    List<String> strList5 = Arrays.asList("one", "two", "three", "four", "five", "six", "seven", "eight"); 

    try { 
     System.out.println("Before modification strList1: [" + strList1 + "]"); 
     ListTruncateEndTest.removeRange(strList1, 5); 
     System.out.println("After modification strList1: [" + strList1 + "]"); 

     System.out.println("Before modification strList2: [" + strList2 + "]"); 
     ListTruncateEndTest.removeRange(strList2, 5); 
     System.out.println("After modification strList1: [" + strList2 + "]"); 

     System.out.println("Before modification strList3: [" + strList3 + "]"); 
     ListTruncateEndTest.removeRange(strList3, 5); 
     System.out.println("After modification strList1: [" + strList3 + "]"); 

     System.out.println("Before modification strList4: [" + strList4 + "]"); 
     ListTruncateEndTest.removeRange(strList4, 5); 
     System.out.println("After modification strList4: [" + strList4 + "]"); 

     System.out.println("Before modification strList5: [" + strList5 + "]"); 
     ListTruncateEndTest.removeRange(strList5, 5); 
     System.out.println("After modification strList5: [" + strList5 + "]"); 
    } catch (Exception e) { 
     System.out.println("Error: [" + e.toString() + "]"); 
    } 
} 

Before modification strList1: [[]] 
After modification strList1: [[]] 
Before modification strList2: [[one, two, three]] 
After modification strList2: [[one, two, three]] 
Before modification strList3: [[one, two, three, four, five]] 
After modification strList3: [[one, two, three, four, five]] 
Before modification strList4: [[one, two, three, four, five, six]] 
Clearing out sublist: [[six]] 
Error: [java.lang.UnsupportedOperationException] 

Есть ли что-то не так с тем, как я клиринговым подсписком? или это ошибка в Java 8? Моя версия Java 8 на Mac: java-версия «1.8.0_45» Рабочая среда Java (TM) SE (сборка 1.8.0_45-b14) 64-разрядная виртуальная машина Java HotSpot TM (сборка 25.45-b02) , смешанный режим)

+0

Вы также можете рассмотреть возможность распечатки stacktrace вашего исключения 'ex.printStackTrace()' вместо сообщения. – hotzst

ответ

2

Листы, возвращаемые Arrays.asList, фиксированной длины, поэтому звоните clear по телефону subList s выбрасывает UnsupportedOperationException.

Вместо этого вы должны использовать ArrayList.

List<String> strList2 = new ArrayList<>(Arrays.asList("one", "two", "three")); 
+0

Спасибо, Paul, Когда я использовал новый ArrayList <> и добавил к нему элементы, я не получил ошибку, которая соответствует вашему ответу. U отправил ответ, прежде чем я узнал, так что U получить кредит на это. – user3688090

Смежные вопросы