2017-05-06 52 views
0

我想制作一个可以比较整数的Android应用程序。然而,当我试图比较整数,并且我需要删除一些条目,因为它们是冗余的或者它们不适合,我不能使用Iterator.remove()而不会遇到NullPointerException。下面是具体的输出:比较数据编号,Iterator.remove()抛出NullPointerException

E/AndroidRuntime: FATAL EXCEPTION: main 
      Process: com.daita.musicale, PID: 22649 
      java.lang.UnsupportedOperationException 
       at java.util.AbstractList.remove(AbstractList.java:638) 
       at java.util.AbstractList$SimpleListIterator.remove(AbstractList.java:75) 
       at com.daita.musicale.MainActivity.checkNotes(MainActivity.java:115) 
       at com.daita.musicale.MainActivity$3.onClick(MainActivity.java:74) 
       at android.view.View.performClick(View.java:5198) 
       at android.view.View$PerformClick.run(View.java:21147) 
       at android.os.Handler.handleCallback(Handler.java:739) 
       at android.os.Handler.dispatchMessage(Handler.java:95) 
       at android.os.Looper.loop(Looper.java:148) 
       at android.app.ActivityThread.main(ActivityThread.java:5417) 
       at java.lang.reflect.Method.invoke(Native Method) 
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

这里是代码区(在com.daita.musicale.MainActivity.checkNotes(MainActivity.java:115)),它给我的错误。

public boolean[] checkNumbers(String code1, String code2) { 
    if (code != null) { 
     List<String> c1 = Arrays.asList(code1.replace("-1.0,", "").replace("null", "").split(",")); 
     List<String> c2 = Arrays.asList(code2.replace("-1.0,", "").replace("null", "").split(",")); 
     Iterator<String> c1iterator = c1.iterator(); 
     Iterator<String> c2iterator = c2.iterator(); 
     boolean strike = false; 
     double prev = 0; 
     int i = 0; 
     boolean[] correctness = new boolean[c1.size()]; 
     while (c1iterator.hasNext()) { 
      double c1hertz = Double.parseDouble(c1iterator.next()); 
      double c2hertz = Double.parseDouble(c2iterator.next()); 
      double difference = c1hertz - c2hertz; 
      if (difference > -1 && difference < 1) { 
       correctness[i] = true; 
       double prevDifference = prev - c1hertz; 
       if (prevDifference > -1 && prevDifference < 1) { 
        c1iterator.remove(); //specific issue location! (this is line 115 of MainActivity) 
        c2iterator.remove(); 
        i = 0; 
        correctness = new boolean[c1.size()]; 
       } else { 
        prev = c1hertz; 
        correctness[i] = true; 
       } 
      } else { 
       if (strike) { 
        correctness[i] = false; 
        try { 
         correctness[i - 1] = false; 
        } catch (ArrayIndexOutOfBoundsException aioobe) { 
         aioobe.printStackTrace(); 
        } 
       } else { 
        correctness[i] = true; 
       } 
      } 
      i++; 
     } 
     return correctness; 
    } else { 
     return null; 
    } 
} 

我已经看过两个代码审查和堆栈溢出的其他问题,例如:

Calling remove in foreach loop in Java Removing object from ArrayList in for each loop 拆卸列表元素,同时通过它迭代 我将不胜感激任何帮助。谢谢!

回答

0

Arrays.asList版本是不变,这就是确切原因,它抛出一个UnsupportedOperationException

由Java文档指出:

Arrays.asList返回由指定数组支持的固定大小列表。

那只是表示你不能修改列表。

解决方案:

List<String> c1 = new ArrayList<>(Arrays.asList(code1.replace("-1.0,", "") 
.replace("null", "").split(","))); 

List<String> c2 = new ArrayList<>(Arrays.asList(code2.replace("-1.0,", "") 
.replace("null", "").split(","))); 
0

,因为它支持用迭代

List<String> c1 = new ArrayList<>(Arrays.asList(code1.replace("-1.0,", "").replace("null", "").split(","))); 
List<String> c2 = new ArrayList<>(Arrays.asList(code2.replace("-1.0,", "").replace("null", "").split(","))); 
+0

这同样是一个很好的答案,@berrytchaks,只是我看到的和首先使用了另一种去除使用ArrayList。 – Vicky

+0

很高兴你忘记了,即使它不是因为我的解决方案;) – berrytchaks

+0

非常感谢:D! – Vicky

相关问题