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)