在添加到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)
答案 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);