3

我最近知道使用strycatchNullPointerException是一种不好的做法。

如果是这样,那么我有以下问题:

  1. 为什么这是一个不好的做法?
  2. 捕捉 a 的替代方法是NullPointerException什么?
4

5 回答 5

8

当您在一段您希望在​​特定情况下引发 NPE 的代码周围添加一个 try/catch 块时,您可能会无意中忘记该代码使用的另一个对象,该对象也可能为 null 并导致一个对象。然后,当您在 catch 块中添加代码以对预期的 NPE 做出反应时,代码也将在意外的 NPE 上执行。这最多会输出一个误导性的错误消息,最坏的情况会导致完全意外的程序行为。

一个例子:

try {
    ThingamabobFactory.getInstance().createThingamabob(ThingamabobFactory.getDefaults()).thingamabobify();
} catch(NullPointerException e) {
      // so... which of the above method calls did return null?
      // ...or was the NPE even thrown INSIDE one of these methods??
}

因此,当您希望某个对象在某些情况下为 null 并且您想要处理这种情况时,请通过检查if (object == null)以避免任何误报来做到这一点。

于 2013-01-22T21:59:42.553 回答
4

捕获 NullPointerException 的最大问题是知道如何处理它,因为它可能有很多可能的原因。

如果您专门测试 null,您可以更确定您知道什么是 null 以及为什么。例如,假设一段代码包含对在特定情况下返回 null 的方法的调用,并且您希望在它这样做时采取一些措施。如果您立即测试方法结果,您知道null 是由于导致方法返回 null 的情况。

另一方面,如果您将块包装在 try-catch 中并捕获 NullPointerException,则该方法可能返回 null,但您无法确定发生了什么。try 块中可能出现了其他问题,导致异常。

于 2013-01-22T22:01:42.640 回答
0

您可以避免使用 throws 直接处理,也可以使用BCEL尝试另一种方法。

于 2013-01-22T22:01:45.160 回答
0

如果可能的话,您应该避免出现任何异常,因为生成它们并通过应用程序发送它们在资源上是昂贵的。

空点很容易处理,只需检查某些内容是否为空

于 2013-01-22T21:56:01.077 回答
-1

当您在音译服务端时包装非法参数异常,或者仅处理可预测的 null 情况以处理模型或方法的先决条件,或在此 catch 内捕获异常,如果实例 Of ... 写入日志或更多。一般来说,永远不要直接捕获空点异常,它是运行时异常,它有逻辑:如果你知道代码中哪里会是空,然后处理它。如果你不知道,在你抓到之后,你会做什么?你不是JVM,对吧?

于 2013-11-21T05:23:20.263 回答