我刚接触安卓/Java编程,不确定如何正确处理这个警告。
方法调用 '' 可能会导致 'Java.lang.NullPointerException'
我应该使用断言(assert)来消除警告吗?
还是使用运行时异常(runtime exception)?
感谢任何帮助。
我刚接触安卓/Java编程,不确定如何正确处理这个警告。
方法调用 '' 可能会导致 'Java.lang.NullPointerException'
我应该使用断言(assert)来消除警告吗?
还是使用运行时异常(runtime exception)?
感谢任何帮助。
searchView
不在那里,你仍然可以继续应用程序,请这样做。例如,只需从方法返回。但最好记录此情况,以便在测试时能够发现它。RuntimeException
,这些异常是未经检查的,因此可能会导致应用程序崩溃。我开始在确定id不为空的简单方法上使用 @SuppressWarnings("ConstantConditions")
。
@Herrbert74 建议是可行的,但有时候最好不要在整个方法中添加 @SuppressWarnings("ConstantConditions")
。更好的做法是在被警告的代码行上使用 //noinspection ConstantConditions
。
以下是我的经验之谈:
当方法简单时,请使用
@SuppressWarnings("ConstantConditions")
当方法复杂且需要仅消除特定行的警告时,请使用
//noinspection ConstantConditions
正如@matiash所指出的,没有一种适合所有情况的解决方案。
对我来说,一个好的折中方案是禁用所有对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=""_ -> !null"" />
</annotation>
</item>
</root>
是的。在验证时使用 if (Object != null){}
是正确的方式。try {} catch (NullPointerException) {}
是下一个解决方案,这种情况下更受青睐。
如果你想要摆脱它,请抛出一个 NullPointerException
。在这种情况下,Lint 将会忽略它。public void myFunc() throws NullPointerException{}
。
无论如何,良好的编码总是意味着在运行时验证可能存在的问题。验证!= null
就可以了,在可能为null的情况下应该始终使用。
我喜欢这个链接的回答。
警告不是错误。而你所谈论的那个警告说“它可能会产生”,而不是“它必须产生”。所以选择权在你手中。可以选择添加空指针检查,也可以选择不添加。
所以,如果你确定你的代码中的findViewById永远不会导致NPE,则不需要添加空指针检查。
我使用了Objects.requireNonNull()
,在我看来这是一种不错的方式。正如@matiash所提到的,在每种情况下都不是一种万无一失的方式,但是在你确定数据不会为null
的情况下,你可以使用这种方法来摆脱警告。如果由于某些未知原因它确实失败了,那么你将会得到NullPointerException
,而即使不使用这个,你也会得到。
// before
cal.setTime(date);
// after
cal.setTime(Objects.requireNonNull(date));