Android 安卓;setColorFilter可能会产生NullPointerException“;小心消失了

Android 安卓;setColorFilter可能会产生NullPointerException“;小心消失了,android,android-studio,nullpointerexception,android-tablayout,colorfilter,Android,Android Studio,Nullpointerexception,Android Tablayout,Colorfilter,我正在开发一个简单的应用程序,它有TabLayout。每个选项卡都有自己的可绘制图标。当选项卡处于活动状态时,其图标应为白色,否则应为深色。现在,当我编写此代码时: tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) {

我正在开发一个简单的应用程序,它有TabLayout。每个选项卡都有自己的可绘制图标。当选项卡处于活动状态时,其图标应为白色,否则应为深色。现在,当我编写此代码时:

tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                tab.getIcon().setColorFilter(ContextCompat.getColor(MainActivity.this, R.color.colorIcons), PorterDuff.Mode.SRC_IN);
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                tab.getIcon().setColorFilter(ContextCompat.getColor(MainActivity.this, R.color.colorDivider), PorterDuff.Mode.SRC_IN);
            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });
Android studio提醒我注意NullPointerException:

然而,当我将此提取到单独的方法时,一切正常,Android Studio不会抱怨:

tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                setIconColor(tab.getIcon(), true);
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                setIconColor(tab.getIcon(), false);
            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });
这种新方法:

private void setIconColor(Drawable icon, boolean active){
        if (active) {
            icon.setColorFilter(ContextCompat.getColor(MainActivity.this, R.color.colorIcons), PorterDuff.Mode.SRC_IN);
        } else {
            icon.setColorFilter(ContextCompat.getColor(MainActivity.this, R.color.colorDivider), PorterDuff.Mode.SRC_IN);
        }
    }

奇怪的是,在将功能发送到单独的方法之后,它不再抱怨方法调用可能会产生NullPointerException。我是否遗漏了什么,或者这是Android studio的一个不良行为?

您看到此警告是因为
TabLayout
中的
getIcon()
方法有注释。要查看它,您可以在IDE中查看该方法的源代码(我相信通过按住shift键并单击),或者搜索该方法

在任何情况下,此注释的目的都是让您作为开发人员了解此方法可能返回
null
,因此您可能希望在应用程序逻辑中为此类情况制定计划。否则,如果在
getIcon()
返回
null
时尝试调用
setColorFilter()
,则会导致
NullPointerException