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

Den*_*nis 2 java coding-style exception-handling nullpointerexception

我想设置Integer一个特定的值,即0或在另一个类中找到的属性.由于该类的实例存储在MapListS,但这个地图可以在点为空,我不知道它的两种方式来处理这个更好.

Integer value = 0;
if (myMap != null && 
    myMap.get(keyForList) != null && 
    myMap.get(keyForList).get(0) != null) {
    value = myMap.get(keyForList).get(0).getAttribute();
}
Run Code Online (Sandbox Code Playgroud)

或者我认为更好,更有效的方式:

Integer value = 0;
try {
    value = myMap.get(keyForList).get(0).getAttribute();
} catch (NullPointerException e) {
    // without doing anything value is 0 as expected 
}
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

Bri*_*new 7

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

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

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

Integer result = a.getB().getC().getD();
Run Code Online (Sandbox Code Playgroud)

因此,我的建议是:

  1. 检查出空对象模式,这意味着你可以在上面的场景中没有空检查
  2. 像上面这样的代码指向真正缺乏OO功能.上面的代码应该让对象a本身得到b,对象b会得到c,等等.在其目前的形式它打破了德米特法律,并公开你如何a,b,c等都是由.请记住,OO是为了让对象为你做事,而不是让他们告诉你他们是由什么组成的,并让你自己做.