【问题标题】:Passing exception from anonymous interface to a method signature将异常从匿名接口传递给方法签名
【发布时间】:2020-08-21 01:06:11
【问题描述】:

我遇到了一种情况,我需要将异常从定义在方法主体内的匿名接口传递给方法定义。我不确定这是否是描述我的问题的正确方法,但我会尝试通过编码来解释。

这就是代码示例

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{
    // ...
}

【问题讨论】:

    标签: java android function android-studio interface


    【解决方案1】:

    对于您当前的实现,如果populateDataList 抛出异常,则取决于fetchData。如果你在onCompletedListener.onCompleted 周围做try-catch,那么你不应该声明它。如果你想传播到populateDataList,那么你可以这样做:

    首先你可以在实现和接口中添加throws ExceptiononCompleted。当你实现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;
      }
    
    }
    

    备注:

    • 最好使用特定异常并避免抛出像Exception 这样的通用异常
    • 如果您使用的是 java 8+,那么您可以用 lambda 替换您的匿名内部类
    • 你应该实例化一个通用的ArrayList,即new ArrayList&lt;&gt;()

    【讨论】:

      【解决方案2】:

      我注意到您的代码中存在一些冲突,例如实例化通用数组列表 new ArrayList&lt;&gt;(),因此希望这些更改可以解决您的问题。

      import java.util.*;
      
      public class Networking{
      
          public List<String> populateDataList(){
          List<Data> dataList = new 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);
      }
      
      

      【讨论】:

        【解决方案3】:
        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);
        }
        

        【讨论】:

          猜你喜欢
          • 2012-11-24
          • 2012-12-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多