Java 当方法返回null时处理映射返回类型

Java 当方法返回null时处理映射返回类型,java,Java,下面的方法返回一个映射。我添加了一个伪代码,跳过DAO如何返回值映射 public Map<Intger,Integer> getIDsBasingonRanks(){ Map<Integer,Integer> m = new HashMap<>(); // Dao operation fetcing values from DB; if(dao==null){ //logging some er

下面的方法返回一个映射。我添加了一个伪代码,跳过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;
}
我觉得在dao=null条件下处理上述方法的返回语句很棘手。如何在返回null时提供方法的返回,以克服null指针,因为我们无法处理它们

在方法中获取空值是您所不期望的吗?抛出异常。您可以创建一些自定义项,比如IDNotFoundException,抛出它并捕获它。请注意,异常只是程序员可以使用的另一种资源。唯一危险的例外是那些你没有抓住的

另一方面,如果有一个空值是可以接受的,但是您需要注意的是,您可以将它包装在一个

中,那么在您的方法中获得一个空值是您不期望的?抛出异常。您可以创建一些自定义项,比如IDNotFoundException,抛出它并捕获它。请注意,异常只是程序员可以使用的另一种资源。唯一危险的例外是那些你没有抓住的

另一方面,如果具有null值是可以接受的,但您需要注意的是,您可以将其包装在一个

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

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

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

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


如果您不想返回null值,则始终可以使用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;

}

如果您不想返回空值,可以使用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;
}一种可能性是可选的

一种可能性是可选的


在调用其上的任何成员函数m2.getKey等之前,请检查m2是否为null。就像您在getIDsBasingonRanks函数中检查dao是否为null一样。这回答了问题。但是,任何其他方法都可以像返回字符串一样返回map;如果需要不同类型的错误检测返回,可以使用。为什么要在每个获取方法中检查dao==null?根据java中的设计模式,dao应该实例化一次,因此检查一次。您也可以尝试捕获NullPointerException并在catch块中处理它。在调用m2.getKey等任何成员函数之前,请检查m2是否为null。就像您在getIDsBasingonRanks函数中检查dao是否为null一样。这回答了问题。但是,任何其他方法都可以像返回字符串一样返回map;如果需要不同类型的错误检测返回,可以使用。为什么要在每个获取方法中检查dao==null?根据java中的设计模式,dao应该实例化一次,因此检查一次。您也可以尝试捕获NullPointerException并在catch块中处理它。最好捕获NullPointerException并处理DAO为null的问题,而不是假装一切正常并有一个空映射。如果我理解的话,问题不是如何处理DAO为null,但是返回值为null并不是一个好的做法,这就是为什么要尝试捕捉它。您不会在catch中返回null,但是可以做一些有用的事情,比如记录异常,尝试重新设置dao,甚至像您建议的那样返回空映射。关键在于尝试捕捉异常,而不是避免它。Map可能是空的,不仅因为dao是空的,而且获取的结果集也是空的。@Johan:我喜欢这个想法,答案符合我的目的。不过,所有的解决方案都很好。最好抓住NullPointerException并处理DAO为null的问题,而不是假装一切正常并有一个空映射。如果我理解的话,问题不是如何处理DAO为null,但是返回值为null并不是一个好的做法,这就是为什么要尝试捕捉它。您不会在catch中返回null,但是可以做一些有用的事情,比如记录异常,尝试重新设置dao,甚至像您建议的那样返回空映射。关键在于尝试捕捉异常,而不是避免它。Map可能是空的,不仅因为dao是空的,而且获取的结果集也是空的。@Johan:我喜欢这个想法,答案符合我的目的。尽管所有的解决方案都很好,但请投票支持我们有一个名为Optional的实用程序。我不知道。但是在这里,它改变了调用方法和已经编写的方法的完整签名。Upvote用于知道我们有一个名为Optional的实用程序。我不知道。但这里它改变了ca的完整签名 方法和已编写的方法。
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;
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);