正确的方法来处理Android Studio的NullPointerException lint警告

我是新来的android / java编程,我很困惑如何妥善处理这个警告。

方法调用“'可能产生'Java.lang.NullPointerException'

在这里输入图像说明

我是否应该断言取消警告? 在这里输入图像说明

或者是一个运行时exception? 在这里输入图像说明

任何帮助,将不胜感激。

Solutions Collecting From Web of "正确的方法来处理Android Studio的NullPointerException lint警告"

我怀疑这个问题是否可以得出肯定的答案,因为这是一个意见问题。 或者至less我相信 – 也是一种意见。 🙂

我知道你想要“0警告”(一个非常值得赞赏的目标),但是可能没有“一刀切”的问题。 那说…

我相信你不应该这样做:

  • 使用断言 。 虽然可以添加断言语句,但Dalvik会忽略它们。 你可以configuration一个仿真器来使用它们,但不是一个真正的设备(请参阅我可以在Android设备上使用断言? )。 所以虽然它可能会删除警告,但在实践中是无用的。
  • 有方法抛出NullPointerException 。 一般来说,这将是一个坏主意。 在这种情况下,由于您可能重写 onOptionsItemSelected() ,所以甚至不可能。

检查(variable != null)通常是最好的方法。 如果是,那么该怎么做,还有其他一些select。

  • 如果这是一个问题,你可以从中恢复 ,即你可以继续申请,即使searchView不在那里,只是这样做。 例如,从方法返回。 尽pipelogging这个情况是一个好主意,所以你可以在testing时发现它。
  • 否则,如果继续是不可能的,抛出一个exception。 你想早点失败 ,这样就可以很容易地发现问题。 这种情况的一个合理的例外是IllegalStateException(请参阅Java相当于.NET System.InvalidOperationException )。 这基本上表明这个方法是在不适当的时候执行的。 但要小心,作为一个RuntimeException ,这些exception是未经检查的,因此可能会导致应用程序崩溃。

我开始使用

@SuppressWarnings("ConstantConditions")

在简单的方法,我确信该ID不是null。

我个人更喜欢使用try {} catch {},因为它更优雅。 然而,如果你想象把每一个可能的NULL值都放入一个try catch(如果它们不是彼此相邻的话),它会为你的代码添加大量的批量,

正如@matiash所指出的,没有一种万能的解决scheme。

对我来说,一个很好的折衷办法是禁用所有对findViewById()调用的NullPointerException警告,并保留其他方法调用。 这样我负责检查资源ID,但如果我犯了其他错误,仍然可以获得警告的好处。

为了达到这个目的,我在Android Studio快速修复菜单中添加了_ -> !null方法合同。

该动作在我的项目根目录的android/support/v7/app/annotations.xml中生成了以下文件文件。

 <root> <item name='android.support.v7.app.AppCompatActivity android.view.View findViewById(int)'> <annotation name='org.jetbrains.annotations.Contract'> <val val="&quot;_ -&gt; !null&quot;" /> </annotation> </item> </root> 

更新:不幸的是,它不能幸免于Android Studio重新启动:-(外部注释是非常有用的,所以我希望我能find一种方法来使Android Studio在重新启动后加载它们。

是。 使用if (Object != null){}进行validation是正确的。 try {} catch (NullPointerException) {}是在这种情况下首选的下一个解决scheme。

如果你想得到它,抛出一个NullPointerException 。 林特在这种情况下将忽略它。 public void myFunc() throws NullPointerException{}

无论如何,良好的编码总是意味着在运行时validation一切可能的问题。 validation!= null就好,只要有可能就应该使用null。

我喜欢这个链接的答案。

警告不是错误。 你所说的警告是“可能产生”,不要说“它必须产生”。 所以select是你的。 要么添加空检查或不

所以,如果您确定代码中的findViewById永远不会是NPE的原因,那么不要添加空检查。

What @ Herrbert74build议它肯定工作正常,但有时最好不要将@SuppressWarnings("ConstantConditions")到整个方法中(如果它不是微不足道的),更好的方法可能是在警告行上使用//noinspection ConstantConditions

这些是我的经验法则:

  • 当方法很简单时,使用@SuppressWarnings("ConstantConditions")

  • 当方法很复杂时,使用//noinspection ConstantConditions ,只需要在特定行中删除警告