-1

Any ideas as to why I am getting a NullPointerException when adding to an ArrayList within a HashMap. The HashMap is used to map keywords from a tokenized attribute from an object in another ArrayList, invList. The keywords are then added to the HashMap, indexHM, as the key. The index values of where those keywords occur in invList are then added to the ArrayList within the HashMap indexHM. And this is where the crash occurs, any ideas? Thanks in advance.

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;
}  

Here is the stack trace:

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 Answers1

1

You are not using the same key as when you create the key value pair

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

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

Use the lowercase version of the key

indexHM.get(tokens.toLowerCase()).add(j);
RAZ_Muh_Taz
  • 4,059
  • 1
  • 13
  • 26