我有一个方法如下;它进行一些计算,然后返回一个 HashMap。
public Map<Integer, Animal> method() {
// do some computation
returns hashMap;
}
1.)如果哈希映射返回null
,我会得到一个空指针异常吗?如果是这样我应该把它当作
public Map<Integer, Animal> method() throws{
这样调用方法会处理它吗?
我有一个方法如下;它进行一些计算,然后返回一个 HashMap。
public Map<Integer, Animal> method() {
// do some computation
returns hashMap;
}
1.)如果哈希映射返回null
,我会得到一个空指针异常吗?如果是这样我应该把它当作
public Map<Integer, Animal> method() throws{
这样调用方法会处理它吗?
当您获得一个对象时,检查它是否为空...如果不打算使用空值,您可以指定它可能会抛出一个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);
}
不,它不会给出空指针异常,因为您只是在返回HashMap
. 在对返回的任何操作之前调用方法时,HashMap
请确保检查返回的值不为空。
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;
}