2014-01-11 38 views
2

我收到不受支持的操作異常,當我從列表中刪除項目。java.lang.UnsupportedOperationException android arraylist

new AlertDialog.Builder(getActivity()) 
         .setMessage(result.getString("Message")) 
         .setPositiveButton("OK", new DialogInterface.OnClickListener() { 

          @Override 
          public void onClick(DialogInterface dialog, int which) { 
           miPaymentModel.remove(index); 
          }) 
         .show(); 

}

堆棧跟蹤是這裏

01-11 16:42:37.610: E/AndroidRuntime(25930): FATAL EXCEPTION: main 
01-11 16:42:37.610: E/AndroidRuntime(25930): java.lang.UnsupportedOperationException 
01-11 16:42:37.610: E/AndroidRuntime(25930): at java.util.AbstractList.remove(AbstractList.java:638) 
01-11 16:42:37.610: E/AndroidRuntime(25930): at com.paksoft.people.Fragment.MiPaymentFragment$DeleteCardAccount$1.onClick(MiPaymentFragment.java:395) 
01-11 16:42:37.610: E/AndroidRuntime(25930): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166) 
01-11 16:42:37.610: E/AndroidRuntime(25930): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-11 16:42:37.610: E/AndroidRuntime(25930): at android.os.Looper.loop(Looper.java:137) 
01-11 16:42:37.610: E/AndroidRuntime(25930): at android.app.ActivityThread.main(ActivityThread.java:4499) 
01-11 16:42:37.610: E/AndroidRuntime(25930): at java.lang.reflect.Method.invokeNative(Native Method) 
01-11 16:42:37.610: E/AndroidRuntime(25930): at java.lang.reflect.Method.invoke(Method.java:511) 
01-11 16:42:37.610: E/AndroidRuntime(25930): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:788) 
01-11 16:42:37.610: E/AndroidRuntime(25930): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555) 
01-11 16:42:37.610: E/AndroidRuntime(25930): at dalvik.system.NativeStart.main(Native Method) 
+1

你能再發表更多代碼?特別是miPaymentModel聲明。和完整的堆棧跟蹤。謝謝 – Aerilys

+0

ArrayList無法刪除或添加項目的權限時會觸發此異常。請檢查你的數據列表。 –

+0

@SwapnilSonar,我該如何添加此權限?我使用List而不是ArrayList。 –

回答

13

參考在Arrays.asList返回一個固定大小的列表

從類API文檔here

Arrays.asList:返回一個固定大小的列表支持指定陣列。

你不能add它;你不能從它remove。您不能在結構上修改List

爲了支持這種類型的操作

創建LinkedList,它支持更快remove

List<String> list = new LinkedList<String>(Arrays.asList(split)); 

Ref Answerhttps://stackoverflow.com/a/2965808/2123594和學分轉到@polygenelubricants

+2

嘿,不要搜索,然後直接複製/粘貼別人的答案,假裝它是你自己的。這是從http://stackoverflow.com/questions/2965747/why-i-get-unsupportedoperationexception-when-trying-to-remove-from-the-list – NigelK

1

試試這個..

因爲列表是由原始備份您不能從Arrays.asList返回的列表中刪除項陣列

List<String> miPaymentModel = new LinkedList<String>(Arrays.asList(array_name)); 

Link 1Link 2

0

摘要列表與一些方法在默認情況下是不是抽象的,而是拋出UnsupportedOperationException異常的

/** 
* {@inheritDoc} 
* 
* <p>This implementation always throws an 
* {@code UnsupportedOperationException}. 
* 
* @throws UnsupportedOperationException {@inheritDoc} 
* @throws IndexOutOfBoundsException  {@inheritDoc} 
*/ 
public E remove(int index) { 
    throw new UnsupportedOperationException(); 
} 

罪魁禍首適配器是數組實現中的以下幾行。 它不返回java.util.ArrayList,這是一個抽象名單的本地實現,其名稱爲java.util.Arrays.ArrayList,它也是私有的。這是非常可怕的編碼。

public static <T> List<T> asList(T... a) { 
    return new ArrayList<>(a); 
} 

/** 
* @serial include 
*/ 
private static class ArrayList<E> extends AbstractList<E> 
    implements RandomAccess, java.io.Serializable 
{ 
    private static final long serialVersionUID = -2764017481108945198L; 
    private final E[] a; 

    ArrayList(E[] array) { 
     a = Objects.requireNonNull(array); 
    } 

    @Override 
    public int size() { 
     return a.length; 
    } 

    @Override 
    public Object[] toArray() { 
     return a.clone(); 
    } 

    @Override 
    @SuppressWarnings("unchecked") 
    public <T> T[] toArray(T[] a) { 
     int size = size(); 
     if (a.length < size) 
      return Arrays.copyOf(this.a, size, 
           (Class<? extends T[]>) a.getClass()); 
     System.arraycopy(this.a, 0, a, 0, size); 
     if (a.length > size) 
      a[size] = null; 
     return a; 
    } 

    @Override 
    public E get(int index) { 
     return a[index]; 
    } 

    @Override 
    public E set(int index, E element) { 
     E oldValue = a[index]; 
     a[index] = element; 
     return oldValue; 
    } 

    @Override 
    public int indexOf(Object o) { 
     if (o==null) { 
      for (int i=0; i<a.length; i++) 
       if (a[i]==null) 
        return i; 
     } else { 
      for (int i=0; i<a.length; i++) 
       if (o.equals(a[i])) 
        return i; 
     } 
     return -1; 
    } 

    @Override 
    public boolean contains(Object o) { 
     return indexOf(o) != -1; 
    } 

    @Override 
    public void forEach(Consumer<? super E> action) { 
     Objects.requireNonNull(action); 
     for (E e : a) { 
      action.accept(e); 
     } 
    } 

    @Override 
    public void replaceAll(UnaryOperator<E> operator) { 
     Objects.requireNonNull(operator); 
     E[] a = this.a; 
     for (int i = 0; i < a.length; i++) { 
      a[i] = operator.apply(a[i]); 
     } 
    } 

    @Override 
    public Spliterator<E> spliterator() { 
     return Spliterators.spliterator(a, Spliterator.ORDERED); 
    } 
} 
相關問題