我的方法如下;它做了一些计算,然后返回一个HashMap。
public Map<Integer, Animal> method() {
// do some computation
returns hashMap;
}
1。)如果哈希映射返回null
,那么我会得到空指针异常吗?如果是这样我应该把它当作
public Map<Integer, Animal> method() throws{
这样调用方法会处理它吗?
答案 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;
}