Передача исключения из анонимного интерфейса в подпись метода - PullRequest
0 голосов
/ 06 мая 2020

Я столкнулся с ситуацией, когда мне нужно передать исключение из анонимного интерфейса, определенного внутри тела метода, в определение метода. Я не уверен, что это правильный способ описать мою проблему, но я попытаюсь объяснить с помощью кодирования.

Итак, это пример кода

public interface OnCompletedListener{
    void onCompleted(Object result);
}

public class Networking{

    public void fetchData(OnCompletedListener onCompletedListener){
        // Fetching data
    }

    public List<Data> populateDataList(){
        List<Data> dataList = new ArrayList();
        fetchData(new OnCompletedListener(){
            @Override
            public void onCompleted(Object result){
                if(result == null) throw new Exception("exception");
            }
        });
    }

}

Итак, Моя цель здесь - добавить исключение в сигнатуру метода populateDataList (). потому что я могу просто добавить его в подпись метода onCompleted () анонимного интерфейса. Итак, есть ли способ передать исключение в сигнатуру метода, как это.

public List<Data> populateDataList() throws Exception{
    // ...
}

Ответы [ 2 ]

0 голосов
/ 06 мая 2020
This code should run.

import java.util.*;

public class Networking{

    public List<String> populateDataList(){
    List<Data> dataList = new java.util.ArrayList<Data>();            
        fetchData(new OnCompletedListener(){
            @Override
            public void onCompleted(Object result){
                if(result == null) new Exception("exception");
            }
        });
    return dataList;
    }

    public void fetchData(OnCompletedListener onCompletedListener){
        // Fetching data
    }



}


interface OnCompletedListener{
    void onCompleted(Object result);
}
0 голосов
/ 06 мая 2020

В вашей текущей реализации это зависит от fetchData, если populateDataList выдает исключение. Если вы сделаете try-catch около onCompletedListener.onCompleted, вы не должны объявлять это. Если вы хотите распространиться на populateDataList, вы можете сделать следующее:

Сначала вы можете добавить throws Exception к onCompleted в реализации и в интерфейсе. Когда вы реализуете fetchData и вызываете onCompletedListener.onCompleted, вы должны объявить fetchData, чтобы выбросить Exception. И, наконец, вы должны объявить populateDataList, чтобы выбросить Exception. Ваш код будет выглядеть как

public interface OnCompletedListener {
  void onCompleted(Object result) throws Exception;
}

public class Networking{

  public void fetchData(OnCompletedListener onCompletedListener) throws Exception {
    onCompletedListener.onCompleted(null);
  }

  public List<Data> populateDataList() throws Exception {
    List<Data> dataList = new ArrayList<>();
    fetchData(new OnCompletedListener(){
      @Override
      public void onCompleted(Object result) throws Exception{
        if(result == null) throw new Exception("exception");
      }
    });
    return dataList;
  }

}

Примечания:

  • рекомендуется использовать определенные c исключения и избегать генерации исключений c, например Exception
  • , если вы работаете с java 8+, вы можете заменить свой анонимный внутренний класс на лямбда
  • , вы должны создать экземпляр generi c ArrayList, т.е. new ArrayList<>()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...