Warning en Equals supuestamente nulo

Tengo el siguiente Warning:

Вызов метода 'равняется', может произвести 'java.lang. NullPointerException'

Mi línea de código es la siguiente:

    if(menu.getItem(2).getIcon().getConstantState().equals(ContextCompat.getDrawable(fragmentActivity, R.mipmap.buscar_warning).getConstantState()))

Nunca я ха generado ошибка, pero никакой entiendo del todo el warning, lo que estoy haciendo, es компаратор el ícono de mi menú превосходящий обманный una imagen que tengo en el directorio mipmap.

EDITO:

Lo mismo я pasa en los otros if довод "против" menu.getItem(0) y menu.getItem(1)

EDITO2:

"Ordenar Por" Esto ocurre en mi método "filtrarChecks" donde guardo todo lo seleccionado en, "Filtrar por" o "Busqueda" (esto зависят de los RadioButtom, CheckButtom y un EditText que posee un menú), лет y lo paso por un adaptador que reodena oculta elementos de un ExpandableListView

EDITO3:

Necesito hacer esta igualdad afuera del método onOptionsItemSelected (Объект MenuItem) {...} Никакой se insista. Ми Este es onOptionsItemSelected

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        this.item = item;
        switch(item.getItemId()){
            case R.id.ordenar_item:
                //Desaparecen todos los demás
                if(filtrosLl.getVisibility()==View.VISIBLE)
                    filtrosLl.setVisibility(View.GONE);
                if(busquedaMet.getVisibility()==View.VISIBLE)
                    busquedaMet.setVisibility(View.GONE);

                //Aparece/desaparece Ordenar Por
                if(prioridadesLl.getVisibility()==View.GONE) {
                    prioridadesLl.setVisibility(View.VISIBLE);
                }else{
                    prioridadesLl.setVisibility(View.GONE);
                }
                return true;
            case R.id.filtrar_item:
                //Desaparecen todos los demás
                if(prioridadesLl.getVisibility()==View.VISIBLE)
                    prioridadesLl.setVisibility(View.GONE);
                if(busquedaMet.getVisibility()==View.VISIBLE)
                    busquedaMet.setVisibility(View.GONE);

                //Aparece/desaparece Filtrar Por
                if(filtrosLl.getVisibility()==View.GONE) {
                    filtrosLl.setVisibility(View.VISIBLE);
                    //mensajeFiltrosTv.setVisibility(View.GONE);
                }else {
                    filtrosLl.setVisibility(View.GONE);
                    /*if(!TextUtils.isEmpty(mensajeFiltrosTv.getText()))
                        mensajeFiltrosTv.setVisibility(View.VISIBLE);*/
                }
                return true;
            case R.id.buscar_item:
                //Desaparecen todos los demás
                if(prioridadesLl.getVisibility()==View.VISIBLE)
                    prioridadesLl.setVisibility(View.GONE);
                if(filtrosLl.getVisibility()==View.VISIBLE)
                    filtrosLl.setVisibility(View.GONE);

                //Aparece/desaparece Buscar Por
                if(busquedaMet.getVisibility()==View.GONE) {
                    busquedaMet.setVisibility(View.VISIBLE);
                }else{
                    busquedaMet.setVisibility(View.GONE);
                }
                return true;
            case android.R.id.home:
                fragmentActivity.finish();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
3
задан 22.12.2016, 19:53
3 ответа

warning покажи, что это не хорошая практика программирования распределять стоимость идентификации постоянной формы:

 menu.getItem(2);

потому что идентификация могла бы существовать или нет. Рекомендуемое состоит в том, чтобы получать идентификацию более безопасного способа (который не вызывал бы исключение во время выполнения):

menu.findItem(R.id.miMenu);

ó:

item.getItemId();

Пример второго случая:

mi_menu.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/hello"
          android:icon="@drawable/ic_hello"
          android:title="@string/shello" />
    <item android:id="@+id/bye"
          android:icon="@drawable/ic_bye"
          android:title="@string/sbye" />
</menu>

В Activity

Надувать Меню Resource:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.my_menu, menu);
    return true;
}

Распределять действие для каждого элемента меню:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.hello:
        sayHello();
        return true;
    case R.id.bye:
        sayBye();
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}
1
ответ дан 24.11.2019, 12:03
  • 1
    оба вызова: menu.findItem (R.id.miMenu); и item.getItemId (); они не решают warning – Maguz 22.12.2016, 20:18

Ты не должен получать элементы menГє посредством индекса, так как ты можешь использовать индекс, который не соответствует элементу и может помечать, как он упоминает о сообщении:

Method invocation 'equals' май произведи 'java.lang. NullPointerException'

рекомендуемый получать статьи согласно Ваш пойдите, пример:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.menu1:

      // if(menu.getItem(2).getIcon().getConstantState().equals(ContextCompat.getDrawable(fragmentActivity, R.mipmap.buscar_warning).getConstantState()))

     if (item.getIcon().getConstantState().equals(ContextCompat.getDrawable(fragmentActivity, R.mipmap.buscar_warning).getConstantState()))
      ...
      ...



        return true;
    case R.id.menu2:

     if (item.getIcon().getConstantState().equals(ContextCompat.getDrawable(fragmentActivity, R.mipmap.imagen2).getConstantState()))
      ...
      ...



        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
  }   

}
0
ответ дан 24.11.2019, 12:03
  • 1
    просвет, así это у меня есть в mé каждый onOptionsItemSelected (), но comparació n той, которую я консультирую, он в другой funció n... (он состоит в фильтре, в том, чтобы приказывать из-за и поисковая служба) – Maguz 19.12.2016, 14:26
  • 2
    Осуществите if, который ты предложил в другом mé совсем (отличный onOptionsItemSelected) и он следует за мной помечая warning в " equals" – Maguz 22.12.2016, 18:47

Как твое добро ты говоришь, что его один warning следовательно это предупреждение. Предупреждение ссылается на то, что для твоего меню, специально для статей он может быть определенным:

  • статья 1
  • статья 2
  • статья 3

Но он предупреждает тебя, потому что МОЖЕТ существовать возможность, который для метода getItem(i) нет ссылки для вышеупомянутого индекса и это могло бы вызывать одну exception недействительного. Ты можешь помещать getItem(1000) и он даст тебе предупреждение, однако во время выполнения твое приложение произведет счастье exception

РЕДАКТИРОВАНИЕ

Согласно моей перспективе, заставлять скрывать этот warning посредством кода это мне кажется очень очень тяжелым, также я не понимаю интенсивность в скрывать это, когда он не затрагивает ни в чем в только предупреждении, однако, если ты не хочешь увидеть это, ты можешь идти:

Windows -> Preferences -> General -> Editors -> Text Editors -> Annotations 

Поиски Warning (предпоследний выбор) и ты достаешь check выбор Vertical ruler

0
ответ дан 24.11.2019, 12:03
  • 1
    и как стоивший, что существовал значок в menú и так снимать warning? – Maguz 15.12.2016, 22:45
  • 2
    má s, что значок твоей статьи, это СТАТЬЯ в вопросе, которую бросает warning, как кажется, не возможно получать полное количество статей в твоем меню – sioesi 15.12.2016, 22:48
  • 3
    @Maguz всех форм, на которые ссылается твой код? чем является то, чего ты стремишься к тому, чтобы достичь с этим if и который делать в случае, если он будет выполнен? – sioesi 15.12.2016, 22:51
  • 4
    sioesi СНАЧАЛА: это фильтр, если есть какой-либо включенный, я меняю значок на один с фоном другого цвета. В этой части главным образом и resumiento много, я консультируюсь, если есть какой-то фильтр, включенный, а именно, если помещен этот значок с цветом – Maguz 15.12.2016, 22:57
  • 5
    я думаю, что нет способа проверять без warning этой informació n, так как фильтр ты применяешь это к нему во времени ejecució n, поэтому нет СТОИМОСТИ, определенной для этого фильтра. – sioesi 15.12.2016, 22:58

То, что я понимаю, что эта часть:

ContextCompat.getDrawable(fragmentActivity, R.mipmap.buscar_warning)

Может оказываться, что он возвращает стоимость null, а следовательно возможно, что, захотев получить следующее: .getConstantState(), я бросил в тебя ошибку NullPointeException.

Ты был бы должен обеспечивать себе сначала, который первое сообщение не возвратило тебе null:

if(ContextCompat.getDrawable(fragmentActivity, R.mipmap.buscar_warning) != null && menu.getItem(2).getIcon().getConstantState().equals(ContextCompat.getDrawable(fragmentActivity, R.mipmap.buscar_warning).getConstantState()))
0
ответ дан 03.12.2019, 18:32
  • 1
    Нет, для equals часть, которую ты комментируешь, - безразличная, проблема, - в котором menu.getItem(2).getIcon().getConstantState() может быть недействительным и поэтому сделав .equals из NullPointerException –  17.07.2017, 13:47