我想将Integer
设置为特定值,即0或在另一个类中找到的属性。由于此类的实例存储在Map
List
s中,但此时此映射可能为空,我想知道处理此问题的两种方法中哪一种更好。
Integer value = 0;
if (myMap != null &&
myMap.get(keyForList) != null &&
myMap.get(keyForList).get(0) != null) {
value = myMap.get(keyForList).get(0).getAttribute();
}
或者我认为更好,更有效的方式:
Integer value = 0;
try {
value = myMap.get(keyForList).get(0).getAttribute();
} catch (NullPointerException e) {
// without doing anything value is 0 as expected
}
感谢您的帮助!
答案 0 :(得分:7)
标准建议是不应将异常用于流量控制。它们相对较重,打破了标准的控制流程,因此很难遵循。它们应该用于特殊情况。
这并不是说你不能用它们从条件中恢复,但是如果检查(比如说)null
或零是容易/更明确的,那么你应该优先考虑。
我会注意到(但是)Java是冗长的,并且没有简单的操作来处理代码中的默认值/空值,如:
Integer result = a.getB().getC().getD();
因此,我的建议是:
a
本身获得b
,而对象b
将获得c
,依此类推。在它的当前形式中,它会打破Law of Demeter,并向您展示如何组成a
,b
,c
等。请记住,OO是关于让对象为你做事情,而不是让他们告诉你他们是由什么组成的,并让你自己做。答案 1 :(得分:1)
如果代码中没有意外事件,请避免例外。我建议如下:
Integer value = 0;
if (myMap != null)
{
if(myMap.get(keyForList) != null && !myMap.get(keyForList).isEmpty())
value = myMap.get(keyForList).get(0).getAttribute();
else
System.out.println("There is no key " + keyForList + " in my map!");
}
else
System.out.println("My map is null!");
通过这种方式,您可以确定null值的位置(用于调试目的)。
答案 2 :(得分:0)
例外比if
贵得多,所以通常最好在可能的情况下避免使用它们,特别是如果try{}
块中只有一个语句的话。
但是,当你可以在try {}中包含大量代码时,异常开始变得更有意义。我认为这在您的示例代码中已经开始出现。即使你只有一个if语句,它也有复杂的条件。使用try-catch
避免这种情况可能会更好。
当预期输入通常有效时,异常可以捕获错误,例如输入错误。
通过捕获NullPointerException来检测输入(如方法参数)空指针很少是个好主意。要么之前有if
,要么只是让异常从你的方法中抛出而不进行干预,如果它是调用者的责任(用if和throw NullPointerException
自己检测空指针甚至可能是明智的,而不需要调用任何东西其他人)。
答案 3 :(得分:0)
异常是指正常的执行流程失败,我们无法继续。 使用If-else代码不会中断