如何解决nullpointerException?

时间:2015-02-18 14:58:49

标签: android

actionBar.setHomeButtonEnabled(false);

这行代码是根据logcat创建nullpointerException,如何解决这个问题?

    package com.ftfl.ftflnavigationtab;

import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.ActionBar.TabListener;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;

import com.ftfl.ftflnavigationtab.adapter.TabsPagerAdapter;

@SuppressLint("NewApi")
@SuppressWarnings("deprecation")
public class MainActivity extends ActionBarActivity implements TabListener{

    private ViewPager viewPager;
    private TabsPagerAdapter mAdapter;
    private android.support.v7.app.ActionBar actionBar;
    // Tab titles
    private String[] tabs = { "General Health", "Vaccination", "Growth Rate" };

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

        // Initilization
        viewPager = (ViewPager) findViewById(R.id.pager);
        actionBar = getSupportActionBar();
        mAdapter = new TabsPagerAdapter(getSupportFragmentManager());

        viewPager.setAdapter(mAdapter);
        actionBar.setHomeButtonEnabled(false);

        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);        

        // Adding Tabs
        for (String tab_name : tabs) {
            actionBar.addTab(actionBar.newTab().setText(tab_name)
                    .setTabListener((android.support.v7.app.ActionBar.TabListener) this));
        }

        /**
         * on swiping the viewpager make respective tab selected
         * */
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageSelected(int position) {
                // on changing the page
                // make respected tab selected
                actionBar.setSelectedNavigationItem(position);
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
            }

            @Override
            public void onPageScrollStateChanged(int arg0) {
            }
        });
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        viewPager.setCurrentItem(tab.getPosition());

    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }
}

3 个答案:

答案 0 :(得分:0)

调试代码的哪一部分会抛出NullPointerException,然后,在它超出之前,您可以验证您使用它的对象是否为空。

如果您将对象作为参数传递,则可以执行以下操作:

if(MyObject != null)
{
    DoOperation(MyObject);
}

如果您正在从对象调用方法:

if(MyObject != null)
{
    MyObject.myMethod();
}

如果您认为需要,您也可以使用try / catch进行环绕,但解决问题的最佳方法是在使用对象之前对其进行验证。

答案 1 :(得分:0)

您应该考虑使用ActionBarActivity,如下所示:

public class MainActivity extends ActionBarActivity {
}

Documentation advice:
注意:如果要实现包含操作栏的活动,则应使用ActionBarActivity类,该类是此类[FragmentActivity]的子类,因此允许您在API级别7上使用Fragment API,更高。

编辑:
您的res/layout/styles.xml可能如下所示:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
</style>

如果您希望操作栏遵循黑暗主题,则应删除.NoActionBar或将其替换为.DarkActionBar

答案 2 :(得分:0)

NPE在您使用actionBar分配后首次访问getSupportActionBar()时发生,这意味着getSupportActionBar()返回null。根据文档,当当前主题没有操作栏时,它返回null。

您的清单必须声明支持操作栏的主题,例如Theme.AppCompat.Light。把它放在清单中的活动声明中,如下所示:

<activity android:theme="@style/Theme.AppCompat.Light" ... >

此处有更多信息:http://developer.android.com/guide/topics/ui/actionbar.html#Adding