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

时间:2015-09-04 22:53:08

标签: java loops for-loop jframe

我一直在编写一个简单的JFrame程序来解决基本的数学方程式,程序需要5个值,其中最多两个可能为空,识别正确的方程并计算空值。下面这部分代码获取散列图中的5个值,由字符串(V,U,S,A,T)标识,标识哪些为空并将它们添加到单独的数组(nullvalues),然后通过它迭代(nullValueLoop)识别合适的方程并解决未知问题。

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

我在尝试调试时添加了很多system.out,并且包含了控制台输出以希望显示最新情况。调用的异常来自另一个类(当程序继续),试图调用第二个空值并将其发现为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

1 个答案:

答案 0 :(得分:1)

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

我很惊讶你没有得到ConcurrentModificationException