2

我想将 an 设置Integer为特定值,即 0 或在另一个类中找到的属性。由于此类的实例存储在 a Mapof Lists 中,但此时此映射可能为 null,我想知道两种处理此问题的方法中哪一种更好。

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

4 回答 4

7

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

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

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

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

因此,我的建议是:

  1. 检查空对象模式,这意味着您可以在上述场景中不进行空检查
  2. 像上面这样的代码表明真正缺乏 OO 功能。上面的代码应该让 objecta本身得到 get b,而 objectb会得到c,依此类推。以目前的形式,它违反了得墨忒耳法则并向您展示a,bc是如何组成的。请记住,OO 是关于让对象为您做事,而不是让它们告诉您它们的组成部分并让您自己做。
于 2012-11-15T11:22:36.297 回答
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 值在哪里(用于调试目的)。

于 2012-11-15T11:28:12.433 回答
0

异常比 更昂贵if,因此通常最好在可能的情况下避免它们,特别是如果try{}块中只有一条语句。

但是,当您可以在 try{} 中包装大量代码时,异常开始变得更有意义。我认为在您的示例代码中开始出现这种情况。即使您只有一个 if 语句,它也有复杂的条件。避免这种try-catch情况可能会更好。

当预期输入通常有效时,异常可以很好地捕获错误,例如格式错误的输入。

通过捕获 NullPointerException 来检测输入(如方法参数)空指针并不是一个好主意。如果是调用者的责任,或者if之前有,或者只是让异常从你的方法中抛出而不进行干预(甚至可以用 if 和throw NullPointerException你自己来检测空指针,而不调用其他任何东西)。

于 2012-11-15T11:31:12.890 回答
0

例外情况是正常的执行流程失败,我们无法继续。使用 If-else 代码不会中断

于 2012-11-15T11:50:10.187 回答