10

我在 Android Studio 中有点困惑。我之前没有在 Eclipse 中看到过这种错误。

例子:

    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction tf = fragmentManager.beginTransaction();
    Fragment oldFragment = fragmentManager.findFragmentByTag(AddDialogFragment.TAG);

这段代码工作正常,但 fragmentManager.beginTransaction(); 突出显示并说:方法调用'fragmentManager.beginTransaction'可能会产生'java.lang.NullPointerException'少......(Ctrl + F1)

此检查报告指定检查范围内始终为真或假的条件,并根据代码的数据流分析指出可能引发 RuntimeException 的位置。此检查还报告 Nullable/NotNull 合同违规。可以配置支持合约的注解(默认使用来自 annotations.jar 的 @Nullable/@NotNull 注解)

我必须先检查 Null 吗?

    FragmentManager fragmentManager = getFragmentManager();
    if(fragmentManager != null)
       FragmentTransaction tf = fragmentManager.beginTransaction();
    Fragment oldFragment = fragmentManager.findFragmentByTag(AddDialogFragment.TAG); 

我以前从未在任何 Tut 或示例中看到过这一点。如果这是一个比对不起更愚蠢的问题,但我仍然是初学者:)。

4

2 回答 2

13

从我所见,Android Studio 显示了太多关于潜在的警告NullPointerExceptions,即使对于永远不会返回 null 的方法也是如此。我只是忽略了其中一些,但仔细检查所有这些很有用,因为有时我会错过一个重要的。

如果您查看 android 源代码,很容易看出它getFragmentManager()永远不会返回 null :

public FragmentManager getFragmentManager() {
    return mFragments;
}

其中 mFragments 在整个班级中仅分配一次:

final FragmentManagerImpl mFragments = new FragmentManagerImpl();
于 2013-06-24T08:31:57.953 回答
0

而是在androidx使用requireFragmentManager()中。否则,使用getParentFragmentManager()

这将使警告消失。出于这个原因,Google 添加了这些 API。

于 2020-01-22T19:13:41.983 回答