我有很多这样的调用:
(ListView) getView().findViewById(R.id.main_list_view);
(TextView) getView().findViewById(R.id.items_no);
....
AndroidStudio告诉我,他们可能会产生NullPointerException
:
方法调用
getView().findViewById(R.id.main_list_view)
可能产生java.lang.NullPointerException
更少。。。(Ctrl+F1)该检查分析方法控制和数据流,以报告可能的情况始终为true或false的条件,其值为静态证明是恒定的,以及可能导致违反可归零性合同。
变量、方法参数和标记为
@Nullable
或@NotNull
的返回值被视为可为null(或分别不为null),并在分析期间用于检查可空性合约,例如报告可能的NullPointerException
错误。使用
@Contract
可以定义更复杂的合同注释,例如:
@Contract("_, null -> null")
—如果方法的第二个参数为null,则方法返回null@Contract("_, null -> null; _, !null -> !null")
—如果第二个参数为null,则方法返回null,否则返回
@Contract("true -> fail")
——一个典型的assertFalse
方法,如果传递true给它,则抛出异常检查可以配置为使用自定义
@Nullable
@NotNull
注释(默认情况下将使用annotations.jar中的注释)
幸运的是,这一切都有效,但我能对这段代码进行改进吗?
这是android.support.v7.app.AppCompatActivity中的一个已知问题,已在v24中修复。
https://code.google.com/p/android/issues/detail?id=203345
android.support.v4.app.FragmentActivity或android.app.Activity 不会有任何问题
您应该忽略问题;
正如@DanDar3所写的那样->getView()可以返回null,AndroidStudio强调了这一点。
但如果你真的想让AndroidStudio快乐-当然你可以…:
Just-assert视图不为空:
View view = getView();
assert view != null;
(ListView) view.findViewById(R.id.main_list_view);
(TextView) view.findViewById(R.id.items_no);
这是因为getView()
可能返回null并被注释为@Nullable
,请检查代码中的源代码及其JavaDoc-CTRL+单击getView()调用。
/**
* Get the root view for the fragment's layout (the one returned by {@link #onCreateView}),
* if provided.
*
* @return The fragment's root view, or null if it has no layout.
*/
@Nullable
public View getView() {
return mView;
}
您可以自己包装代码并检查null以消除警告,或者将光标放在findViewById()调用内的任何位置,等待几秒钟灯泡出现(或按Alt+Enter),然后选择建议的解决方案之一。