Java - For 循环在一次迭代后停止

标签 java loops for-loop jframe

我一直在编写一个简单的 JFrame 程序来求解基本数学方程,该程序采用 5 个值(其中最多两个可能为空),识别正确的方程并计算空值。下面的这部分代码采用 hashmap 中的 5 个值,由字符串 (V,U,S,A,T) 标识,标识哪些值为 null,并将它们添加到一个单独的数组 (nullvalues) 中,然后迭代该数组(nullValueLoop) 来确定合适的方程并求解未知数。

问题出现在 nullValueLoop 中,它似乎只迭代一次,在第一次迭代后突然停止。

我在尝试调试时添加了很多 system.out,并包含了控制台输出以希望显示正在发生的情况。调用的异常来自另一个类(随着程序继续)尝试调用第二个 null 值并发现它为 null。

希望我已经解释得很好,非常感谢任何帮助。

   public void calculate() {

    // Stores the keys to reference the null values in HashMap<Double> values;
    ArrayList<String> nullvalues = new ArrayList<String>();


    for(String tempKey : values.keySet()){
        if(values.get(tempKey)==null){
            nullvalues.add(tempKey);
            System.out.print("Found null value " + tempKey + ", adding to array. \n");
        }
    }

    System.out.print("Beginning loop of nullvalues, of size " + nullvalues.size() + "\n");

    nullValueLoop:
    for(String nullvalue : nullvalues){



        System.out.print("Starting outerloop, iterating nullvalue " + nullvalue + "\n");

        EquationLoop:
        for(Equation e : registeredEquations){

            // Flag to keep ` of if we have any unknowns yet
            boolean foundUnknown = false;

            // Iterate through the values required
            // If the loop does not exit, the equation only requires one of our null values and the program continues.
            for(String s : e.getRequiredChars()){

                // If we have a null value and havent yet had one, all is good
                if(nullvalues.contains(s) && foundUnknown == false){
                    foundUnknown = true;

                // We have more than one null value, abort
                } else if(foundUnknown == true && nullvalues.contains(s)){
                    continue EquationLoop;
                }
            }


            System.out.print("Using equation " + e.getIdentifier() + "\n");

            System.out.print("Found suitable equation.\n");

            Double returnValue = e.calculate(values, nullvalue);

            System.out.print("Calculated return value.\n");

            values.put(nullvalue, returnValue);

            nullvalues.remove(nullvalue);

            System.out.print("Added new value to values array\n");
            System.out.print("Calculated value  " + nullvalue + " to " + values.get(nullvalue) + "\n");
            break EquationLoop;
        }
        System.out.print("Ending outerloop iteration \n");
    }
    mainWindow.updateTextBoxes();

}

控制台输出:

Couldn't load value T | Assigning to null 
Couldn't load value A | Assigning to null 
Found null value T, adding to array. 
Found null value A, adding to array. 
Beginning loop of nullvalues, of size 2
Starting outerloop, iterating nullvalue T
Using equation 3
Found suitable equation.
Calculated return value.
Added new value to values array
Calculated value  T to 10.0
Ending outerloop iteration 
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at uk.co.ElliotPurvis.MainWindow.updateTextBoxes(MainWindow.java:143)
at uk.co.ElliotPurvis.Main.calculate(Main.java:136)
at uk.co.ElliotPurvis.MainWindow.actionPerformed(MainWindow.java:118)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
Process finished with exit code 0

最佳答案

EquationLoop内部,您正在修改列表nullvalues,该列表正在由外部循环迭代。这是未定义的行为,您不允许在迭代过程中修改集合。

我很惊讶你没有得到ConcurrentModificationException

关于Java - For 循环在一次迭代后停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32407627/

相关文章:

php - foreach循环返回问题

Python - 来自 csv 的 sumif

javascript - 尝试创建一个简单的多项选择游戏

java - Java中特殊链表方法的实现

java - 在执行时将 JInternalFrame 添加到 JDesktopPane

java - 在我的情况下是 Lock+HasMap 还是 ConcurrentHashMap?

java - 好的做法? REST 中的一两个对象模型用于创建和获取资源

javascript - 如何制作一个返回数组中每个整数的阶乘的函数

java - 了解嵌套循环和类

bash - 为什么这个 bash for 循环很慢?