在扩展方法中获取NullPointerException-Java
在我的在扩展方法中获取NullPointerException-Java,java,inheritance,nullpointerexception,structure,extends,Java,Inheritance,Nullpointerexception,Structure,Extends,在我的UiAutomator测试项目中有4个类: 1: 2: 3: 4: 当程序试图使用类D的方法(类C有使用a、B、D的方法)时,我得到了一个NullPointerException。在a、B、C中没有问题。在D中的方法从B调用方法,我想我在扩展方面有一些问题?另外,我如何在不扩展类的情况下使用B-in-D的方法?谢谢 有几件事: 尽管t是一个泛型,但您假设t有一个方法loadXML();然而,T可能是什么并没有限制 此外,这里是您的NullPointerException的位置: D构造函数
UiAutomator
测试项目中有4个类:
1:
2:
3:
4:
当程序试图使用类D的方法(类C有使用a、B、D的方法)时,我得到了一个NullPointerException
。在a、B、C中没有问题。
在D中的方法从B调用方法,我想我在扩展方面有一些问题?另外,我如何在不扩展类的情况下使用B-in-D的方法?谢谢 有几件事: 尽管
t
是一个泛型,但您假设t
有一个方法loadXML()
;然而,T
可能是什么并没有限制
此外,这里是您的NullPointerException
的位置:
D
构造函数调用B
的构造函数,但是B
的构造函数不调用A
的默认构造函数,后者初始化T
。由于t
未初始化,因此会出现NullPointerException
有关Java中默认构造函数和继承的更多信息,请参阅
我不确定您正在做什么来获取NullPointerException,但我将指出到目前为止我注意到的错误
在A的构造函数中,您可以编写:
t = t.loadXML(tf);
此时t还没有初始化,因此它为null,尝试对其调用方法将导致NullPointerException。这不应该导致代码中D中出现NullPointerException(因为B调用A的默认构造函数,该构造函数将初始化t;请参见下面的说明)。有两种方法可以解决这个问题(取决于您希望发生什么):
1.调用A的其他构造函数(初始化t):
public B(E e, String m, String v, String tf)
{
super(e,m,v,tf)
}
这将执行与您当前在B的构造函数中执行的所有赋值相同的赋值,因为它将调用A的构造函数并在那里执行代码。目前,B的构造函数将静默地调用A的默认构造函数(没有参数的构造函数)。明确地说,这看起来像:
public B(E e, String m, String v, String tf)
{
super();
this.e = e;
this.m = m;
this.v = v;
t = t.loadXML(tf);
}
我假设您在D中添加super语句是因为它给出了一个错误,否则:B没有定义参数构造函数,因此D无法调用它,并将给出一个编译错误。
也就是说,D的构造函数也可以简化为:
public D (E e, String m, String v, String tf)
{
super(e, m, v, tf);
}
我看不出您在扩展方面有什么特别的问题,只是您忘记了重用父类的构造函数
为了回答上一个问题,您可以使用D中的B方法,只需调用它们,就好像它们是在D本身中定义的一样。例如:
public class B extends A {
//I left out your constructors for readability
public String getMAndV(){
return m + v;
}
}
public class D extends B {
//I left out your constructors for readability
public String getGivenStringAndMAndV(String givenString){
return givenString + getMAndV(); //so just call it as if it's defined in the class itself
}
}
你能给我们看一下stacktrace吗?你的loadXML(tf)方法在哪里?当你调用超级构造函数时,它会立即执行。因此,您不需要重新初始化超类的字段。loadXML(tf)方法在类中,我希望这些变量的名称仅被替换以显示您的代码,并且您实际上没有使用变量e、m、n、a、b、c等等。。
public A(E e, String m, String v, String tf)
{
this();
this.e = e;
this.m = m;
this.v = v;
t = t.loadXML(tf);
}
public B(E e, String m, String v, String tf)
{
super(e,m,v,tf)
}
public B(E e, String m, String v, String tf)
{
super();
this.e = e;
this.m = m;
this.v = v;
t = t.loadXML(tf);
}
public D (E e, String m, String v, String tf)
{
super(e, m, v, tf);
}
public class B extends A {
//I left out your constructors for readability
public String getMAndV(){
return m + v;
}
}
public class D extends B {
//I left out your constructors for readability
public String getGivenStringAndMAndV(String givenString){
return givenString + getMAndV(); //so just call it as if it's defined in the class itself
}
}