代码约定 - 捕获异常的好或坏做法,而不是之前的if-checking?

时间:2012-11-15 11:20:49

标签: java exception-handling nullpointerexception coding-style

我想将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 
}

感谢您的帮助!

4 个答案:

答案 0 :(得分:7)

标准建议是不应将异常用于流量控制。它们相对较重,打破了标准的控制流程,因此很难遵循。它们应该用于特殊情况。

这并不是说你不能用它们从条件中恢复,但是如果检查(比如说)null或零是容易/更明确的,那么你应该优先考虑。

我会注意到(但是)Java是冗长的,并且没有简单的操作来处理代码中的默认值/空值,如:

Integer result = a.getB().getC().getD();

因此,我的建议是:

  1. 查看null object pattern,这意味着您可以在上述场景中无法进行空检查
  2. 上面的代码指出了真正缺乏OO功能。上面的代码应该使对象a本身获得b,而对象b将获得c,依此类推。在它的当前形式中,它会打破Law of Demeter,并向您展示如何组成abc等。请记住,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代码不会中断