Android“setColorFilter可能会产生NullPointerException”警告消失

时间:2017-07-01 16:38:44

标签: android android-studio nullpointerexception android-tablayout colorfilter

我正在开发具有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工作室给我一个关于NullPointerException的警告: SetColorFilter may produce 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工作室的不良行为?

1 个答案:

答案 0 :(得分:1)

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

在任何情况下,此注释的目的完全在于您作为开发人员了解此方法可能返回null的事实,因此您可能希望在应用程序中规划此类情况逻辑。否则,如果您在setColorFilter()返回getIcon()时尝试致电null,则会因NullPointerException

而崩溃