Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在扩展方法中获取NullPointerException-Java_Java_Inheritance_Nullpointerexception_Structure_Extends - Fatal编程技术网

在扩展方法中获取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):

  • 将类型为t的参数t传递给构造函数,并使用该参数帮助初始化t

    公共A(E、m、v、tf、T) { 这个(); 这个。e=e; 这个,m=m; 这个,v=v; t=passedT.loadXML(tf); }

  • 其他注释。通过调用A的构造函数,您可以在B中节省一些工作:

    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
        }
    }