Как исправить метод getActionBar может вызвать java.lang.NullPointerException

Я использую панель инструментов в качестве своего действия в действии. Я пытаюсь добавить метод getActionBar().setDisplayHomeAsUpEnabled(true); В файл Activity.java для навигации вверх для старых устройств.

Этот метод вызывает следующее сообщение об ошибке в Android Studio:

Вызов метода может вызывать java.lang.NullPointerException

Навигация вверх на панели инструментов отлично работает на новых устройствах … теперь я пытаюсь понять, как убедиться, что она будет работать для более старых устройств. Пожалуйста, порекомендуйте.

From build.gradle:

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

Из AndroidManifest.xml:

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

Из 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> 

От 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(); } }); } } 

Solutions Collecting From Web of "Как исправить метод getActionBar может вызвать java.lang.NullPointerException"

На самом деле Android Studio не показывает вам сообщение об ошибке, это просто предупреждение.

Некоторые ответы предполагают использование утверждения, во время выполнения Dalvik по умолчанию отключено утверждение , поэтому вы должны фактически включить его, чтобы он действительно что-то делал. В этом случае (утверждение отключено), то, что вы по существу делаете, просто обходит Android Studio, чтобы не показывать вам предупреждение. Кроме того, я предпочитаю не использовать «assert» в производственном коде.

На мой взгляд, то, что вы должны делать, очень просто.

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

Обновление. Если вы используете версию библиотеки поддержки панели действий, вы должны заменить getActionBar () на getSupportActionBar ().

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

Во-первых, вам нужно установить панель инструментов в качестве поддержки ActionBar. Тогда, если вы уверены, что он будет там все время, просто утвердите его как! = Null. Это скажет компилятору, что оно не будет равно NULL, поэтому нулевая проверка пройдет.

 @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() } 

Спасибо Эндрю за ваш ответ. Если у вас есть Nav Drawer или что-то еще, использующее getSupportActionBar (), вам нужно добавить assert getSupportActionBar ()! = Null;

Мир,

Пример:

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

Попробуй это :

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

То, что я сделал, переопределяет метод getSupportActionBar() в моей базовой @NonNull и добавляет аннотацию @NonNull . Таким образом, я получаю только одно предупреждение о появлении в базовом @NonNull о том, как я использую аннотацию @NonNull для чего-то, что имеет @Nullable аннотацию.

  @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(); } 

Add assert getSupportActionBar() != null; Перед getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Я создал общий класс, например:

 public final class Cast { private Cast() {} /** * Helps to eliminate annoying NullPointerException lint warning. */ @android.support.annotation.NonNull public static <T> T neverNull(T value) { return value; } } 

То я могу использовать его для любого вызова с предупреждением NullPointerException, для которого я уверен, что этого никогда не произойдет, например

 final ActionBar actionBar = Cast.neverNull(getSupportActionBar()); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeButtonEnabled(true); 

PS не забудьте добавить «com.android.support:support-annotations» в ваш файл gradle.

  if(actionBar != null) { actionBar.setHomeButtonEnabled(true); actionBar.setBackgroundDrawable(ContextCompat.getDrawable(mContext, R.drawable.action_bar_gradient)); } 

Используйте эту тему: android:theme="@style/Theme.AppCompat.Light.NoActionBar"

 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); toolbar.setTitle("Title"); setSupportActionBar(toolbar); ActionBar actionBar = getSupportActionBar(); actionBar.setHomeButtonEnabled(true); actionBar.setHomeAsUpIndicator(R.drawable.ic_action_previous_item); actionBar.setDisplayHomeAsUpEnabled(true);