在HashMap中添加到ArrayList时出现NullPointerException - “AWT-EventQueue-0”

时间:2017-11-28 19:27:57

标签: java arraylist hashmap

在添加到HashMap中的ArrayList时,为什么我得到NullPointerException的任何想法。 HashMap用于映射来自另一个ArrayList invList中的对象的标记化属性的关键字。然后将关键字添加到HashMap indexHM作为密钥。然后,将这些关键字在invList中出现的位置的索引值添加到HashMap indexHM内的ArrayList中。这是崩溃发生的地方,任何想法?提前致谢。

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 个答案:

答案 0 :(得分: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);