我正在创建一个类,它的私有成员之一是另一个类的对象。当我尝试调用已在我的公共实例方法中创建的类的公共实例方法时,我得到一个NullPointerException。
我测试了它,当我从构造函数调用find函数时,它工作正常,但是当我从下一个随机函数调用find函数时,它给了我异常。发生了什么事?
public class Percolation
{
private WeightedQuickUnionUF uf;
private boolean sites[][];
public Percolation(int N)//constructor
{
sites = new boolean[N][N];
int arraySize = N * N;
WeightedQuickUnionUF uf = new WeightedQuickUnionUF(arraySize);
System.out.println("we found the first node at " + uf.find(31));
}
public void trialQuickFind()
{
System.out.println("we found the first node at " + uf.find(31));
}
}
答案 0 :(得分:8)
在构造函数中,您阴影 uf
。变化
WeightedQuickUnionUF uf = new WeightedQuickUnionUF(arraySize);
到
this.uf = new WeightedQuickUnionUF(arraySize);
Variable shadowing上的维基百科条目(部分),
在计算机编程中,当在某个范围内声明的变量(决策块,方法或内部类)与在外部范围内声明的变量具有相同的名称时,会发生变量阴影。在标识符(名称而不是变量)的级别上,这称为名称屏蔽。这个外部变量被称为内部变量,而内部标识符被称为掩盖外部标识符。
答案 1 :(得分:0)
您已声明了新的本地变量
*
与您的全局变量
不同 WeightedQuickUnionUF uf = new WeightedQuickUnionUF(arraySize);
最好练习封装或使用setter和getter来避免这个问题
private WeightedQuickUnionUF uf;
答案 2 :(得分:0)
用于封装和抽象目的:
创建一个界面,比如说:
public interface UfListener {
getUf();
}
WeightedQuickUnionUF
应implements UfListener
然后将其传递给uf阅读。
然后,给Percolation
和UfListener的实例,并调用它:
uf = ufListener.getUf();