【问题标题】:Handling Map return type when a method returns null当方法返回 null 时处理 Map 返回类型
【发布时间】:2017-08-04 10:37:32
【问题描述】:

下面的方法返回一个 Map。我正在添加一个伪代码,跳过 DAO 如何返回值映射。

public Map<Intger,Integer> getIDsBasingonRanks(){
       Map<Integer,Integer> m = new HashMap<>();
       // Dao operation fetcing values from DB;
       if(dao==null){
           //logging some error or info
           return null;// In this cases Null Pointer will be thrown. How to handle it ?
       }
       m.put()// put the values inside the map from DAO
       return m;
}

现在我从另一个返回 Map 的类调用 getIDsBasingonRanks() 并从该映射中获取值

Map<Integer,Integer> m2 = getIDsBasingonRanks();
m2.getkey();//Incase the map is null we will have Null Pointer Exception
m2.getValue(); //Incase the map is null we will have Null Pointer Exception

我觉得在 dao=null 条件下处理上述方法的 return 语句很棘手。如何在返回 null 时为方法提供返回以克服空指针,因为我们也无法处理它们。

【问题讨论】:

  • 在调用任何成员函数之前检查m2 不是nullm2.getKey() 等)。就像您在 getIDsBasingonRanks 函数中检查 dao 不是 null 一样。
  • 很酷,回答了这个问题。但是任何其他方式来返回地图,就像字符串返回“”;
  • 如果您想要不同类型的错误检测返回,您可以使用Optional
  • 为什么要在每个获取方法中检查 dao == null ?根据 java 中的设计模式,dao 应该被实例化一次并因此被检查一次。您也可以尝试捕获 NullPointerException 并在 catch 块中处理它。

标签: java


【解决方案1】:

一种可能性是可选

public Optional<Map<Integer, Integer>> getIDsBasingonRanks() {

    Map<Integer, Integer> m = new HashMap<>();
    ... // Dao operation fetcing values from DB;
        if (dao == null) {
            return Optional.empty();
        }

    ... // put the values inside the map from DAO
    return Optional.of(m);
}

getIDsBasingonRanks().ifPresent(m ->
        {
            ... m.get(42) ...
        });

int y = getIDsBasingonRanks().map(m -> m.get(42)).orElse(13);

【讨论】:

  • 赞成我们有一个名为 Optional 的实用程序。我不知道。但是这里它改变了调用方法的完整签名和已经写好的方法。
【解决方案2】:

在您的方法中获得null 值是您不期望的吗? 抛出异常。你可以创建一些自定义,比如说IDNotFoundException,扔它然后抓住它。请注意,异常只是您作为程序员可以使用的另一种资源。唯一危险的例外是您没有发现的例外

另一方面,如果 null 的值是“可接受的”,但您要小心,您可以将其包装在 Optional

【讨论】:

    【解决方案3】:

    如果你不想返回一个空值,你总是可以使用 Collections 类返回一个空映射,所以你的代码会变成这样:

    public Map<Intger,Integer>getIDsBasingonRanks(){
    
       Map<Integer,Integer> m =new HashMap<>();
        // Dao operation fetcing values from DB;
            if(dao==null){
                //logging some error or info
            }
            return Collections.emptyMap();// In this case you are returning and empty map which is better
        }
    
        m.put()// put the values inside the map from DAO
            return m;
    

    }

    【讨论】:

    • 最好捕获 NullPointerException 并处理 DAO 为 null 的问题,而不是假装一切正常并拥有一张空地图。
    • 如果我理解的话,问题不在于如何处理 dao 为 null,而是返回值为 null,这不是一个好习惯
    • 这就是为什么你试图抓住它。您不会在 catch 中返回 null,而是执行一些有用的操作,例如记录异常、尝试重新设置 dao 甚至按照您的建议返回空地图。关键在于尝试捕获异常而不是避免它。 Map 可能为空,不仅因为 dao 为空,而且获取的结果集为空。
    • @Johan:喜欢这个想法,答案符合我的目的。不过,所有的解决方案都很棒。
    【解决方案4】:

    您的getIDsBasingonRanks 方法有点不清楚,似乎如果读取操作以某种方式失败,您将记录错误并返回null

    如果是这种情况,我会使用简单的nullcheck 方法:

    Map<Integer,Integer> m2=getIDsBasingonRanks();
    if(m2 != null){
        m2.getkey();
        m2.getValue(); 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 2012-04-26
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多