4

i am getting unsupported operation exception when i remove item from list.

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();

}

stack trace is here

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)
7
  • 1
    Can you post more code? Especially miPaymentModel declaration. And the complete stacktrace. Thanks Commented Jan 11, 2014 at 11:50
  • This exception is fires when arraylist does not give permission to remove or add items in it. Please check your arraylist. Commented Jan 11, 2014 at 11:53
  • @SwapnilSonar so how can i add this permission? I am using List not ArrayList. Commented Jan 11, 2014 at 11:55
  • 1
    @MuhammadAamirALi: Is this list are prepared form array? Some thing asList method? Commented Jan 11, 2014 at 11:59
  • @SwapnilSonar yes it is prepared from asList Commented Jan 11, 2014 at 12:00

3 Answers 3

18

On Arrays.asList returning a fixed-size list

From the Class API Documentation here :

Arrays.asList: Returns a fixed-size list backed by the specified array.

You can't add to it; you can't remove from it. You can't structurally modify the List.

To support this type of operation

Create a LinkedList, which supports faster remove.

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

Ref Answer: https://stackoverflow.com/a/2965808/2123594 and credits are goes to @polygenelubricants

Sign up to request clarification or add additional context in comments.

1 Comment

Hey, don't search and then directly copy/paste someone else's answer pretending it's your own. This is from stackoverflow.com/questions/2965747/…
2

Try this..

You cannot remove item from the list returned by Arrays.asList because the list is backed by the original array

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

Reference from

Link 1 and Link 2

Comments

0

Abstract list is an adapter with some methods that by default aren't abstract but instead throw UnsupportedOperationException's

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

The culprit are the following lines in the Arrays implementation. It does not return an java.util.ArrayList, this is a local implementation of an Abstract list with a misleading name java.util.Arrays.ArrayList, which also is private. It is exceptionally horrible coding.

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);
    }
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.