以下是我的问题的说明。我目前不知道处理NullPointerException的方法。
public class Util
{
private Map<Integer, String> myMap;
public Util(Map<Integer, String> myMap)
{
this.myMap = myMap;
}
public String getVal(Integer region)
{
return myMap.get(region);
}
}
public class UtilTest {
@Test
public void testNull() throws Exception{
Map<Integer, String> myMap = null;
Util util = new Util(myMap);
util.getValue(1);
}
}
上面的代码将按预期给出NullPointerException。我关心的是我应该在构造函数或函数本身中处理它
在构造函数中如下
public Util(Map<Integer, String> myMap)
{
if(myMap != null)
this.myMap = myMap;
else
this.myMap = new Map<>();
}
在功能上,它会与
类似 public String getVal(Integer region)
{
if(myMap != null)
return myMap.get(region);
else
return "";
}
这些方法中哪一个更好,为什么我应该采用另一个?
答案 0 :(得分:9)
它应该在Util类中,因为外部函数应该不了解Util类创建内部的内容。它可以发送任何无效/有效值。构造函数应确保正在妥善处理所有无效/有效值。
其他观点是 - 如果有n个地方创建了Util,那么你必须在所有那些n个地方写下if-else。最好只在构造函数中使用它。
答案 1 :(得分:1)
这是一个意见问题。 但是,由于您没有提供setter方法,我建议在构造函数中进行。
如果您打算稍后提供一个setter(如果当时输入不可用),可以在不检查构造函数的情况下离开。
最后,null可能是您的代码的有效输入,并且您可以在getter方法中检查它并自己抛出异常,而不是让系统抛出空指针。
我的想法,如果没有setter,那么从构造函数中抛出异常。不要让程序抛出空指针。
答案 2 :(得分:0)
我的意见无处可去!
如果有人打电话给new Util(null)
,他就是:
null
,因为他正在测试不依赖于此Map
的类的另一部分可以允许null
(因为永远不会调用Map
)。null
是错误的,只需让代码稍后抛出NPE并让那些敢于使用的人null
感受到后果(又称痛苦的调试)。