【问题标题】:Comparing data numbers, Iterator.remove() throwing NullPointerException比较数据编号,Iterator.remove() 抛出 NullPointerException
【发布时间】:2017-05-06 12:39:20
【问题描述】:

我正在尝试制作一个可以比较整数的 Android 应用。但是,当我尝试比较整数并且我需要删除一些条目时,因为它们是多余的或它们不适合,我不能在不遇到 NullPointerException 的情况下使用 Iterator.remove()。这是具体的输出:

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 在迭代列表时删除列表中的元素 我将不胜感激任何帮助。谢谢!

【问题讨论】:

    标签: java android arraylist iterator


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      使用 ArrayList 因为它支持通过迭代删除

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

      【讨论】:

      • 这是一个同样好的答案,@berrytchaks,只是我第一次看到并使用了另一个。
      • 很高兴你得到了解决,即使它不是因为我的解决方案;)
      猜你喜欢
      • 2023-03-20
      • 2020-05-17
      • 2019-05-29
      • 2014-09-11
      • 2018-07-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      相关资源
      最近更新 更多