How to fix getActionBar method may produce java.lang.NullPointerException

63,159

Solution 1

Actually Android Studio isn't showing you an "error message", it's just a warning.

Some answers propose the use of an assertion, Dalvik runtime has assertion turned off by default, so you have to actually turn it on for it to actually do something. In this case (assertion is turned off), what you're essentially doing is just tricking Android Studio to not show you the warning. Also, I prefer not to use "assert" in production code.

In my opinion, what you should do is very simple.

if(getActionBar() != null){
   getActionBar().setDisplayHomeAsUpEnabled(true);
}

Update: In case you're using the support library version of the Action Bar, you should replace getActionBar() with getSupportActionBar().

if(getSupportActionBar() != null){
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

Solution 2

First off, you need to set the toolbar as the support ActionBar. Then if you're certain it's going to be there all the time, just assert it as != null. This will tell the compiler it won't be null, so the null check passes.

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

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

   assert getSupportActionBar() != null;
   getSupportActionBar().setDisplayHomeAsUpEnabled(true); // it's getSupportActionBar() if you're using AppCompatActivity, not getActionBar()
}

Solution 3

Thank You Andrew for your answer. If you have a Nav Drawer or something else that uses getSupportActionBar() you need to add assert getSupportActionBar() != null;

Peace,

Example:

@Override
public void setTitle(CharSequence title) {
    mTitle = title;
    assert getSupportActionBar() != null;
    getSupportActionBar().setTitle(mTitle);
}

Solution 4

Try this :

private ActionBar getActionBar() {
    return ((AppCompatActivity) getActivity()).getSupportActionBar();
}

Solution 5

What I have done is override the getSupportActionBar() method in my base Activity and add a @NonNull annotation. This way, I only get one lint warning in the base activity about how I use @NonNull annotation for something that has a @Nullable annotation.

    @NonNull
    @Override
    public ActionBar getSupportActionBar() {
        // Small hack here so that Lint does not warn me in every single activity about null
        // action bar
        return super.getSupportActionBar();
    }
Share:
63,159
AJW
Author by

AJW

Trying to learn Java and Android...I appreciate all of the stackoverflow members who give generously of their time and expertise.

Updated on July 05, 2022

Comments

  • AJW
    AJW almost 2 years

    I am using a toolbar as my actionbar in an activity. I am trying to add the method getActionBar().setDisplayHomeAsUpEnabled(true); to the Activity.java file for Up navigation for older devices.

    The method produces the following error message in Android Studio:

    Method invocation may produce java.lang.NullPointerException

    The Up navigation on the toolbar works fine on newer devices...now I'm trying to figure out how to make sure it will work for older devices. Please advise.

    From build.gradle:

    dependencies {
       compile "com.android.support:appcompat-v7:22.1.0"
    }
    

    From AndroidManifest.xml:

    android:theme="@style/Theme.AppCompat.NoActionBar.FullScreen" 
    

    From styles.xml

    <style name="Theme.AppCompat.NoActionBar.FullScreen" parent="AppTheme">
    <item name="android:windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="android:windowFullscreen">true</item>
    

    from Activity.java

    public class CardViewActivity extends AppCompatActivity {
    
       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.cardviewinput);
    
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    
        if (toolbar != null) {
            // Up navigation to the parent activity for 4.0 and earlier
            getActionBar().setDisplayHomeAsUpEnabled(true);
            toolbar.setNavigationIcon(R.drawable.ic_action_previous_item);
            toolbar.setNavigationOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    onBackPressed();
                }
            });
        }
    
    }
    
  • AJW
    AJW about 9 years
    Ok, looks good but the assert line generates a "Cannot resolve symbol 'getSupportActionBar'" error in Android Studio. Should it be "getSupportActionBar()" ? Please advise.
  • gian1200
    gian1200 about 9 years
    Is this valid for production, or only for testing?
  • Scott
    Scott about 9 years
    gian1200 I am not sure. A good question. I was planning to release my app soon, so I will be doing research before I do the release... Thx.
  • gian1200
    gian1200 about 9 years
    My guess is that the compiler will change it to something like "if it is null, then throw an assertExeption"; not allowing you to handle the error.
  • Sheychan
    Sheychan almost 9 years
    You can only access getSupportActionBar when extending AppCompatActivity or FragmentActivity
  • AJW
    AJW about 8 years
    While I originally used assert to "solve" the warning, I agree that your recommended code is better than the assert hack. Answer has been upvoted and accepted. Note that I am using AppCompatActivity as a class so I must use getSupportActionBar() in my solution rather than the getActionBar() that you show above.
  • AJW
    AJW about 8 years
    thanks for your answer. I don't know about using lint. Can you comment on any advantage your answer has vs. Adam Ghani's answer up above?
  • Catalin Morosan
    Catalin Morosan about 8 years
    With Adam's approach you have to write the if statement in all your activities. With my approach you just have to override the getSupportActionBar in the base activity and the rest of the code remains as before.
  • Piyush Kukadiya
    Piyush Kukadiya about 7 years
    Why android studio not giving the same warning for other methods like getSupportActionBar().setTitle() ?
  • ZooMagic
    ZooMagic about 6 years
    I'm using the getSupportActionBar() != null but I am still thrown a null pointer on my toolbar. Does anyone know what is going on? I have tried the assert line, which also just throws a null pointer!??! What is going oN!??!?!?!
  • Adam G
    Adam G about 6 years
    @ZooMagic There are different reasons why it might throw a NPE. I advice you to search for other questions that are similar to yours or post your code on a new question. You need to share your layout file, manifest and Activity code.