如何修复方法调用';设置图标';可能产生';java.lang.NullPointerException';

如何修复方法调用';设置图标';可能产生';java.lang.NullPointerException';,java,Java,如何修复 方法调用setIcon可能会产生java.lang.NullPointerException 将图标设置为选项卡布局时,我收到了这条消息。类似的内容应该可以修复您的警告: private void setupTabIcons() { if (tabLayout!=null){ if (tabLayout.getTabAt(0)!=null) tabLayout.getTabAt(0).setIcon(tabIcons[0]); if (t

如何修复

方法调用
setIcon
可能会产生
java.lang.NullPointerException


将图标设置为选项卡布局时,我收到了这条消息。

类似的内容应该可以修复您的警告:

private void setupTabIcons() {
    if (tabLayout!=null){
      if (tabLayout.getTabAt(0)!=null)
        tabLayout.getTabAt(0).setIcon(tabIcons[0]);
      if (tabLayout.getTabAt(1)!=null)
        tabLayout.getTabAt(1).setIcon(tabIcons[1]); 
      if (tabLayout.getTabAt(2)!=null)
        tabLayout.getTabAt(2).setIcon(tabIcons[2]);
    }
} 

您需要检查
tabLayout
是否不为空

if(tabLayout == null){
    return;
}
ActionBar.Tab x = tabLayout.getTabAt(0);
if(x != null){
    x.setIcon(tabIcons[0]);
}
还要检查
getTabAt
返回的内容是否不为null

if(tabLayout == null){
    return;
}
ActionBar.Tab x = tabLayout.getTabAt(0);
if(x != null){
    x.setIcon(tabIcons[0]);
}

顺便说一句,您的IDE上可能存在一些错误配置,因为这通常是一个警告,而不是错误。

您需要检查getTabAt(x)返回值是否不为null:

private void setupTabIcons(TabLayout tabs) {
    int tabIcons[] = {R.drawable.icon1, R.drawable.icon2, R.drawable.icon3};
    TabLayout.Tab tab;

    for (int x=0; x<3; x++) {
        tab = tabs.getTabAt(x);
        if(tab != null){
            tab.setIcon(tabIcons[x]);
        }
    }
}
private void设置选项卡图标(选项卡布局选项卡){
int tabIcons[]={R.drawable.icon1,R.drawable.icon2,R.drawable.icon3};
TabLayout.Tab选项卡;

对于(int x=0;x您正面临此问题,因为您尚未添加选项卡并尝试设置图标

//Add tabs icon with setIcon() or simple text with .setText()

 tabLayout.addTab(tabLayout.newTab().setIcon(R.mipmap.ic_home));
 tabLayout.addTab(tabLayout.newTab().setIcon(R.mipmap.ic_profile));
 tabLayout.addTab(tabLayout.newTab().setIcon(R.mipmap.ic_settings));

当在使用
tabLayout.setupWithViewPager(viewPager);
设置
tabLayout
之前调用
setIcon
方法时,这将在运行时引发空指针异常

要修复运行时错误,应在活动的
tabLayout.setupWithViewPager(viewPager);
onCreate
方法后调用
setupTabIcons()

但这仍然会在android studio中显示警告,因此要删除警告并防止运行时错误,您应该更改代码以获取选项卡索引,而不是像
.getTabAt(0)
.getTabAt(1)
.getTabAt(2)
部分那样手动设置它

为了获得许可,我将从我的代码中举出一个例子:

private TabAdapter tabAdapter;
private TabLayout tabLayout;
private ViewPager viewPager;

private int[] tabIcons = {
        R.drawable.ic_action_profile,
        R.drawable.ic_action_people,
        R.drawable.ic_action_messages
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);

    viewPager = findViewById(R.id.viewPager);
    tabLayout = findViewById(R.id.tabLayout);

    // Create the adapter that will return a fragment for each of the two
    // primary sections of the activity.
    tabAdapter = new TabAdapter(getSupportFragmentManager());
    tabAdapter.addFragment(new AccountFragment(), "Account");
    tabAdapter.addFragment(new HomeFragment(), "People");
    tabAdapter.addFragment(new CommunicateFragment(), "Messages");

    viewPager.setAdapter(tabAdapter);
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    tabLayout.setupWithViewPager(viewPager);

    for (int i=0; i<tabLayout.getTabCount();i++) {
        tabLayout.getTabAt(i).setIcon(tabIcons[i]);
    }
}
private TabAdapter TabAdapter;
私人摊位摊位;
私人视页机视页机;
私有int[]选项卡图标={
R.drawable.ic\u action\u profile,
R.dravable.ic_action_人,
R.drawable.ic\u action\u消息
};
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
viewPager=findViewById(R.id.viewPager);
tabLayout=findviewbyd(R.id.tabLayout);
//创建适配器,该适配器将为这两个适配器中的每一个返回一个片段
//活动的主要部分。
tabAdapter=新的tabAdapter(getSupportFragmentManager());
tabAdapter.addFragment(新AccountFragment(),“Account”);
tabAdapter.addFragment(newhomefragment(),“People”);
tabAdapter.addFragment(新的CommunicateFragment(),“Messages”);
viewPager.setAdapter(tabAdapter);
viewPager.addOnPageChangeListener(新建TabLayout.TabLayoutOnPageChangeListener(TabLayout));
tabLayout.setupWithViewPager(viewPager);

对于(int i=0;我将谈到堆栈溢出!为了给您一个很好的答案,如果您还没有看到,请看一看,这可能会对我们有所帮助。如果您可以提供一个,这可能也很有用。在本例中,这可能意味着
tabLayout
变量此时为空。请提供更多代码以显示它应该初始化的位置。@SimonBaars假设变量为
null
,那么他的IDE会抱怨
getTabAt
,而不是
setIcon
@SimonBaars可能为null,而是
getTabAt(n)
也可以返回空值。虽然这解决了它,但它不是一个干净的解决方案。我假设这是Android TabLayout。
getTabCount
可用,因此您可以只检查一次选项卡的数量。