HashMap返回NULL时如何处理异常

时间:2012-12-06 16:31:00

标签: java nullpointerexception hashmap

我的方法如下;它做了一些计算,然后返回一个HashMap。

public Map<Integer, Animal> method() {
     // do some computation
     returns hashMap;
    }

1。)如果哈希映射返回null,那么我会得到空指针异常吗?如果是这样我应该把它当作

处理
public Map<Integer, Animal> method() throws{

这样调用方法会处理它吗?

3 个答案:

答案 0 :(得分:2)

当你得到一个对象时检查它是否为null ...如果不是一个空值,你可以指定它可以只为文档抛出NullPointerException,因为它是RunTimeException和所有{ {1}}可以在任何地方播放。

你也可以这样做:

RuntimeExceptions

try{ /* calculate */ } catch(NullPointerException e){ /* process exception */ } 发生时进行处理,以便您可以还原操作或关闭资源或抛出更具描述性的异常......

例如:

NullPointerException

答案 1 :(得分:1)

不,它不会给出空指针异常,因为您只是返回HashMap。在对返回的HashMap执行任何操作之前调用方法时,请确保检查返回的值是否为空。

答案 2 :(得分:1)

当您尝试在NullPointerException变量上使用.时,会出现null。例如:

String s = null;
char c = s.charAt(0); // Tries to access null, throws NPE

NullPointerException可能发生的另一个地方是当您尝试取消装箱null包装时:

Integer integer = null;
int i = integer; // Tries to unbox null, throws NPE

这是您获得NullPointerException的唯一方法。好吧,除非有人明确地抛出一个:

throw new NullPointerException();

但你应该从不那样做。改为投掷IllegalArgumentException

话虽如此,从方法返回null将不会产生NullPointerException。但是,当 返回.时,在该方法的结果上使用null可以:

Map<Integer, Animal> map = method();
map.get(20); // Throws NPE if method() returns null

要解决此问题,请使用null - 检查:

Map<Integer, Animal> map = method();
if (map != null)
    map.get(20); // Never throws NPE

请注意,我们仍然可以将map用作引用,但我们无法访问,因为它是null。这就是你似乎缺少的区别。

编辑您的评论

  

所以你建议我按原样离开method()(没有异常处理)并从调用函数中检查它?

这是一种可能的选择。另一个是抛出一个异常,表明它是null,如果它不应该是。

最大的问题是,允许null吗?如果是,请按原样保留method(),并在调用它时检查它是否为null,就像我上面一样。在Javadoc注释中指出此方法可能会返回null

如果不允许返回null,则在调用该方法时,要么创建Map,要么抛出异常。您甚至可以在null(这称为lazy initialization)时创建地图:

public Map<Integer, Animal> method() {
    if (hashMap == null)
        hashMap = new HashMap<Integer, Animal>();
    return hashMap;
}

如果你的hashMap正在其他地方创建,那么在其他地方创建它之前不应该调用此方法(称为precondition),那么你应该抛出异常。对于违反前提条件,我通常使用IllegalStateException

public Map<Integer, Animal> method() {
    if (hashMap == null)
        throw new IllegalStateException("Must call otherMethod() to initialize hashMap before calling this method.");
    return hashMap;
}