1

我有一个方法如下;它进行一些计算,然后返回一个 HashMap。

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

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

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

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

4

3 回答 3

2

当您获得一个对象时,检查它是否为空...如果不打算使用空值,您可以指定它可能会抛出一个NullPointerException仅用于文档的对象,因为它是一个RunTimeException并且所有内容都RuntimeExceptions可以在任何地方出现。

您还可以执行以下操作:

try{
    /* calculate */
}
catch(NullPointerException e){
    /* process exception */
}

在发生事件时进行处理NullPointerException,因此您可以恢复操作或关闭资源或引发更具描述性的异常......

例如:

try{
    Type o = (Type) map.get(key);
    o.doSomething();
}
catch(NullPointerException e)
{
    throw new RuntimeException("Null values are not accepted!", e);
}
于 2012-12-06T16:36:44.617 回答
1

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

于 2012-12-06T16:34:02.803 回答
1

NullPointerException当您尝试.null变量上使用时会发生A。例如:

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-check:

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

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

编辑您的评论

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

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

最大的问题是,是否允许null?如果是,则保持method()原样,并检查是否null像我上面所说的那样调用它。在您的 Javadoc 注释中指出此方法可能会返回null

如果不允许return null,则在调用该方法时,要么创建Map要么抛出异常。您甚至可以仅在它是null(这称为延迟初始化)时创建地图:

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;
}
于 2012-12-06T16:35:32.913 回答