对于作业,我遇到了一个问题。为了一点点提升,我会告诉你我正在做什么。
这项任务要求我创建一个java applet(尽管我使用的是JFrame
,oops),它以一段文本的形式从用户那里获得输入。使用此文本,程序将显示每个字长的数量,并在单独的窗口中以图形的形式显示结果。我的hashmap包含两个Integer
s,单词的长度以及该长度的长度。
然而,分配要求用户能够上传两个文本文件并比较结果,因此我必须发送一个哈希图数组,每个哈希图都有不同的结果到窗口。我一直这样做:
public void dispatchNewGraph (ArrayList<Map<Integer, Integer>> sortedCount) {
TextAnalyserGraph graphFrame = new TextAnalyserGraph(sortedCount);
}
并在打开的窗口中,传递给构造函数的数据将应用于TextAnalyserGraph类private ArrayList<Map<Integer, Integer>> graphData;
中的此属性
我的问题是当我尝试使用以下代码迭代这个HashMaps数组时出现nullpointerexception
错误:
for(Iterator<Map<Integer, Integer>> i = graphData.iterator(); i.hasNext(); ) {
Map<Integer, Integer> graph = i.next();
for (Integer value : graph.keySet()) {
if(graph.containsKey(value)) {
Integer v = graph.get(value);
if (v.intValue() > largest)
largest = v.intValue();
}
bars++;
}
}
错误从最后一个代码块的第一行开始。如果我将graphData移动到下一行,那么同样的错误就会开始指出graphData的问题。我真的很难在这方面取得进展!
非常感谢! :)
堆栈跟踪
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at TextAnalyserGraph.paint(TextAnalyserGraph.java:47)
at javax.swing.RepaintManager$3.run(RepaintManager.java:819)
at javax.swing.RepaintManager$3.run(RepaintManager.java:796)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:796)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:769)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:718)
at javax.swing.RepaintManager.access$1100(RepaintManager.java:62)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1677)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
答案 0 :(得分:1)
在循环之前,您需要对graphData进行空检查。
我还建议修改你的for循环更好一点。
如果您关心钥匙,可以使用它:
if(graphData != null){
for(Map<Integer, Integer> valueMap : graphData){
for (Map.Entry<Integer, Integer> entry : valueMap.entrySet()) {
if (entry.getValue() > largest)
largest = entry.getValue();
bars++;
}
}
}
但是既然你不关心密钥并且它曾经在你的循环逻辑中使用过,我会建议:
if(graphData != null){
for(Map<Integer, Integer> valueMap : graphData){
for (Integer value : valueMap.values()) {
if (value > largest)
largest = value;
bars++;
}
}
}
答案 1 :(得分:0)
除非您对输入有100%的控制权,否则您需要在请求迭代器之前检查graphData是否为null,然后在请求密钥集之前检查graph是否为null。