public void createGraph () {
int oldFrom = -1;
int oldTo = -1;
for(int i = 0; i < edges.size(); i++) {
EdgeI e = edges.get(i);
int from = e.from;
int to = e.to;
VertexI v = vertices.get(from);
if (from == oldFrom && to == oldTo){
vertexWeight wic = v.neighbors.get(v.neighbors.size() - 1);
wic.w++;
}
else {
v.neighbors.add(new vertexWeight (to, 1));
oldFrom = from;
oldTo = to;
}
}
}
neighbors
是来自 VertexI
类的公共(public) List
。 w
是来自 vertexWeight
类的公共(public)整数。 edges
是位于我的主类中的列表。我不断收到这行代码的空指针异常:
v.neighbors.add(new vertexWeight (to, 1));
尝试了大约 15 分钟,但没有成功。我到底搞砸了什么?
java.lang.NullPointerException
at tester.createGraph(tester.java:60)
at tester.main(tester.java:11)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)
最佳答案
简短回答
使用 vertices.get()
中的 new ArrayList()
初始化 v.neighbors
。
长答案
您的问题忽略了一个关键信息:您如何初始化neighbors
。为什么这很重要?
参见:What is a NullPointerException, and how do I fix it?
在您的情况下,我猜测在程序运行期间 v
或 neighbors
为空。例如,vertices.get(from)
可能返回 null,而 v.neighbors
将不起作用。或者 neighbors
为 null,并且 v.neighbors.add()
将不起作用。
瞧。您承认在初始化 VertexI
时将 neighbors
设置为 null。
解决方案是:使用 new ArrayList()
初始化,而不是 null
。
如果这是不可能的,或者由于某些其他原因您无法避免空指针,您可以像这样进行空指针检查:
if (v != null && v.neighbors != null) {
v.neighbors.add(new vertexWeight (to, 1));
}
这意味着,如果 v
或 neighbors
为空,则不要添加顶点。
但这很复杂并且容易出错。尽可能避免空指针更容易。有人会说,不惜一切代价避免它们!相反,抛出异常或返回一个“空”对象,例如 new ArrayList()
。
关于java - 空指针异常修复 - 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12873923/