如果从getSupportActionBar()收到nullpointerexception,如何继续.setDisplayHomeAsUpEnabled(true

时间:2015-10-12 13:28:30

标签: android nullpointerexception android-actionbar

我的android项目中有以下课程:

public class MainActivity extends AppCompatActivity {

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

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);

        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
    }

    ...
}

检查代码时android说:

Method invocation 'getSupportActionBar().setDisplayHomeAsUpEnabled(true)' at line 27 may produce 'java.lang.NullPointerException'

从理论上讲,这种情况不一定会发生,但我想知道如果发生这种情况,最好的办法是什么......

也许,使用try-catch块并向用户显示礼貌错误消息并最终退出应用程序?

编辑: 我的主要活动的xml以下:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabMode="fixed"
            app:tabGravity="fill"/>
    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"  />
</android.support.design.widget.CoordinatorLayout>

2 个答案:

答案 0 :(得分:1)

这只是一个警告。它说有可能getSupportActionBar()的返回值为空。

因此,如果您想避免此警告,请在调用setDisplayHomeAsUpEnabled方法之前进行null检查。

ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
    // method invoked only when the actionBar is not null.
    actionBar.setDisplayHomeAsUpEnabled(true);
}

答案 1 :(得分:1)

您收到警告的原因是该方法使用标记@Nullable进行注释,表明结果可能是null

基于setSupportActionBar的{​​{3}}:

  

当设置为非null值时,getActionBar()方法将返回ActionBar对象

和常识,你可以期望它不会返回一个null对象,除非你自己没有提供有效的视图(应该立即修复)或者整个android支持库失败(非常不可能)。

如果发生错误,我会做的是抛出可理解的异常:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
if (getSupportActionBar() == null) {
  throw new IllegalStateException("Action bar not set! Toolbar view was: " + toolbar);
}

ActionBar actionBar = getSupportActionBar();