2017-11-28 11 views
-1

HashMap内のArrayListに追加するときにNullPointerExceptionが発生する理由についてのアイデア。 HashMapは、トークン化された属性のキーワードを別のArrayListのオブジェクト(invList)にマップするために使用されます。キーワードは、キーとしてHashMap indexHMに追加されます。 invListでそれらのキーワードがどこにあるかのインデックス値は、HashMap indexHM内のArrayListに追加されます。そして、これはクラッシュが起きる場所です。前もって感謝します。ここでHashMapのArrayListに追加するときのNullPointerException - 「AWT-EventQueue-0」

public String search(String symbol, String keywords, String lowPrice, String highPrice) { 

    double lowerBound = -1; 
    double upperBound = -1; 
    double invPrice; 

    boolean symCheck = true; 
    boolean keyCheck = true; 
    boolean rangeCheck = true; 

    String output = ""; 

    // ArrayList<Integer> places = new ArrayList<>(); <- A fix that didnt work 

    HashMap<String, ArrayList<Integer>> indexHM = new HashMap<>(); 

    String delimiters = "[, ]+"; 

    for (int j = 0; j < invList.size(); j++) { 

     String nameTokens[] = invList.get(j).getName().split(delimiters); 

     //places.add(j); <- A fix that didnt work. 
     for(String tokens : nameTokens) { 

      indexHM.put(tokens.toLowerCase(), new ArrayList<>()); 

      indexHM.get(tokens).add(j); //NULLPOINTEREXCEPTION HERE 

     } 


    } 

    if(symbol.isEmpty()) 
     symCheck = false; 

    String[] keys = keywords.split(delimiters); 

    if(keys[0].isEmpty()) 
     keyCheck = false; 


    try { 

     if(!lowPrice.isEmpty() && !highPrice.isEmpty()) { 

      lowerBound = Double.parseDouble(lowPrice);   

      upperBound = Double.parseDouble(highPrice); 

     }else if(!lowPrice.isEmpty() && highPrice.isEmpty()) { 

      lowerBound = upperBound = Double.parseDouble(lowPrice);   

     }else { 

      rangeCheck = false; 
     } 

    }catch (NumberFormatException e) { 

     return("ERROR: Invalid input, this data will not be used for the search."); 
    } 

    output += "Investments matching your search criteria: \n"; 

    if(keyCheck) { 

     ArrayList<Integer> resultIndex = new ArrayList<>(); 
     System.out.println("HERE"); 

     if(keys.length <= 1) { 

      if(indexHM.containsKey(keys[0].toLowerCase())) 
       resultIndex.addAll(indexHM.get(keys[0].toLowerCase())); 

     }else { 

      for(int k = 0; k < keys.length; k++) { 

       if(indexHM.containsKey(keys[k].toLowerCase())) 
        resultIndex.addAll(indexHM.get(keys[k].toLowerCase()));  
      } 
       resultIndex.retainAll(indexHM.get(keys[keys.length])); 
     } 
     System.out.println(resultIndex); 
     for(Integer i : resultIndex) { 

      if(!symCheck)    
       symbol = invList.get(i).getSymbol(); 

      if(!rangeCheck)    
       upperBound = lowerBound = invList.get(i).getPrice(); 

      if(symbol.equalsIgnoreCase(invList.get(i).getSymbol())) { 

       invPrice = invList.get(i).getPrice(); 

       if(invPrice >= lowerBound && invPrice <= upperBound) { 

        if(invList.get(i).getClass().getCanonicalName().equals("a3.MutualFund")) { 

         output += "MF: " + invList.get(i) + "\n"; 

        }else if(invList.get(i).getClass().getCanonicalName().equals("a3.Stock")) { 

         output += "S: " + invList.get(i) + "\n"; 
        } 
       }    
      }  
     } 

    }else { 

     for(int i = 0; i < invList.size(); i++) { 

      if(!symCheck) { 

       symbol = invList.get(i).getSymbol(); 
      } 

      if(!rangeCheck) { 

       lowerBound = invList.get(i).getPrice(); 
       upperBound = invList.get(i).getPrice(); 
      } 

      if(symbol.equalsIgnoreCase(invList.get(i).getSymbol())) { 

       invPrice = invList.get(i).getPrice(); 

       if(invPrice >= lowerBound && invPrice <= upperBound) { 

        if(invList.get(i).getClass().getCanonicalName().equals("a3.MutualFund")) { 

         output += "MF: " + invList.get(i) + "\n"; 

        }else if(invList.get(i).getClass().getCanonicalName().equals("a3.Stock")) { 

         output += "S: " + invList.get(i) + "\n"; 
        } 
       }      
      }    
     } 
    } 

    return output; 
} 

は、スタックトレースです:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
at a3.Portfolio.search(Portfolio.java:1079) 
at a3.Portfolio$14.actionPerformed(Portfolio.java:681) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) 
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
at java.awt.Component.processMouseEvent(Component.java:6533) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) 
at java.awt.Component.processEvent(Component.java:6298) 
at java.awt.Container.processEvent(Container.java:2236) 
at java.awt.Component.dispatchEventImpl(Component.java:4889) 
at java.awt.Container.dispatchEventImpl(Container.java:2294) 
at java.awt.Component.dispatchEvent(Component.java:4711) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466) 
at java.awt.Container.dispatchEventImpl(Container.java:2280) 
at java.awt.Window.dispatchEventImpl(Window.java:2746) 
at java.awt.Component.dispatchEvent(Component.java:4711) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) 
at java.awt.EventQueue.access$500(EventQueue.java:97) 
at java.awt.EventQueue$3.run(EventQueue.java:709) 
at java.awt.EventQueue$3.run(EventQueue.java:703) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90) 
at java.awt.EventQueue$4.run(EventQueue.java:731) 
at java.awt.EventQueue$4.run(EventQueue.java:729) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 

答えて

1

あなたは

indexHM.put(tokens.toLowerCase(), new ArrayList<>()); 

indexHM.get(tokens).add(j); //not using the lowercase version of the string 

あなたがキーと値のペアを作成するときと同じキーを使用していないキー

の小文字バージョンを使用します
indexHM.get(tokens.toLowerCase()).add(j); 
+0

WOW、最も簡単な修正。ありがとう、あなたの時間を無駄にして申し訳ありません! –

関連する問題