Вызов методов в интерфейсе вызывает исключение нулевого указателя - PullRequest
0 голосов
/ 24 февраля 2019

Я хотел бы вызвать интерфейс, который реализован классом Foo для разделения, но интерфейс всегда возвращает ноль.Вот упрощенный пример, чтобы показать, что я делаю.В реальном проекте есть класс презентатора, который принимает в своем конструкторе интерфейс вычислений, а затем вызывает методы для обновления представлений в моей основной деятельности с помощью кинжала 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
}
}

1 Ответ

0 голосов
/ 24 февраля 2019

A NullPointerException происходит из-за того, что Computation не был создан, поэтому он все еще нулевой.

Интерфейсы, если вы используете их как объект, подобный тому, что вы здесь делаете, должны быть созданы, потому что вы рассматриваете его как объект.

Для вас есть несколько решений:

1) Вы можете просто создать экземпляр Computation с созданным вами объектом Foo.

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().Если ваш метод достаточно прост и функциональность метода одинакова для всех реализаций, использование методов по умолчанию поможет уменьшить объем кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...