首页 > 解决方案 > 在接口中调用方法导致空指针异常

问题描述

出于解耦原因,我想调用由类 Foo 实现的接口,但该接口始终返回 null。这是一个过于简单的例子,只是为了展示我在做什么。在实际项目中,有一个演示者类,它在其构造函数中采用计算接口,然后使用匕首 2 调用方法来更新我的主要活动中的视图。我无法在演示者类或主要活动亲属中初始化接口这个例子。我知道这是可行的,但我不确定如何。

//Interface that has a couple abstract methods
public Interface Computation{
public double add(double somenumber, double anothernumber);
public int multiply(int somenumber, int somenumber);
}

public class Foo implements Computation{
@Override
public double add(double somenumber, double anothernumber){
return somenumber + anothernumber;
};

@Override
public int multiply(int somenumber, int anothernumber){
return somenumber * anothernumber;
};
}

//main class
public class MainClass extends Activity{
private TextView tv;
Computation mComputation;

 @Override
    protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
tv = findviewById(R.id.textview);
tv.setText(mComputation.multiply(4, 9))//here mComputation is null always
}
}

标签: androidinterface

解决方案


ANullPointerException发生是因为Computation尚未实例化,因此它仍然为空。

接口,如果您将它们用作像您在这里所做的那样的对象,则必须实例化,因为您将其视为对象。

有几个解决方案给你:

1)您可以简单地使用您创建ComputationFoo对象进行实例化。

public class MainClass extends Activity{
    private TextView tv;
    Computation mComputation = new Foo();
    ...
}

这会起作用,因为您正在通过使用它的默认构造函数来Computation实例化 。Foo

2)对于您想到的方法,您可以简单地使用静态方法。这避免了创建接口实例的需要。

public interface Computation{
    public static double add(double somenumber, double anothernumber){
        return somenumber + anothernumber;
    }    
    public static int multiply(int somenumber, int anothernumber){
        return somenumber * anothernumber;
    }
}

然后在您的 MainActivity 中像这样使用它:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tv = findviewById(R.id.textview);
    tv.setText(Computation.multiply(4, 9))
}

您不需要Computation mComputation = new Foo();使用此解决方案的对象。

3)您实际上可以只使用默认接口方法而无需创建Foo.

public interface Computation{
    default double add(double somenumber, double anothernumber){ 
        return somenumber + anothernumber;
    }
    default int multiply(int somenumber, int anothernumber){
        return somenumber * anothernumber;
    }
}

然后在您的 MainActivity 中:

public class MainClass extends Activity implements Computation{
    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = findviewById(R.id.textview);
        tv.setText(multiply(4, 9))
    }
}

有了这个方案,你只需要实现Computation接口,并且可以简单的调用multiply()add()方法。如果您的方法足够简单并且方法的功能对于每个实现都是相同的,那么使用默认方法有助于减少相当多的代码。


推荐阅读