2015-09-04 98 views
0

我一直在編寫一個簡單的JFrame程序來解決基本的數學方程,程序需要5個值,其中最多兩個可能爲空,標識正確的方程並計算空值。下面的這段代碼用一個字符串(V,U,S,A,T)標識了一個hashmap中的5個值,標識哪些值爲null,並將它們添加到一個單獨的數組(nullvalues)中,然後迭代(nullValueLoop)來確定一個合適的方程並解決未知問題。Java - for循環在一次迭代後停止

問題出現在nullValueLoop中,它只出現一次迭代,在第一次迭代之後突然停止。

我在嘗試調試時添加了很多system.out,並且包含控制檯輸出以希望顯示正在發生的事情。所調用的異常來自另一個類(隨着程序的繼續)嘗試調用第二個空值並將其發現爲空。

希望我已經解釋了這一點,任何幫助,非常感謝。

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 
+0

請包括'MainWindow.updateTextBoxes()'的代碼並在該代碼中指出143行。 – gla3dr

+0

您是否閱讀過錯誤信息? – Dici

+0

向下/關閉選民,請閱讀整篇文章。 NPE似乎是偶然的(或隨後的錯誤)。 OP詢問爲什麼'初始循環的nullvalues,大小爲2,但循環只執行一次,然後退出調用'updateTextBoxes()' –

回答

1

EquationLoop要修改的列表nullvalues,正在由外循環遍歷。這是未定義的行爲,您在迭代過程中不允許修改集合。

我很驚訝你沒有得到ConcurrentModificationException