android.content. Context.getPackageName ()' на ссылке несуществующего объекта

Привет я работаю с Фрагментами, который реализует интерфейс.

public class SigninFragment extends Fragment implements SigninInterface 

Реализация метода интерфейса в классе фрагмента следующие.

@Override
public void afterSubmitClicked(String userId, Bundle bundle) {

    Log.d(TAG,"Calling time afterSubmitClicked called"+bundle);

    if(!userId.equals("-1")){
        //Logged in successfully
        //Move to MusicHome

        Intent mIntent = new Intent(getActivity(),MusicHome.class);
        mIntent.putExtra("SigninFragment.user_details", bundle);
        startActivity(mIntent);

    }else{
        //Logging in failed
        //show error dialog
    }

}

Этот метод называют после exectuting AsynchronousTask (который расширяет AsyncTask), класс.

Но я получаю катастрофический отказ. И шоу сообщения об ошибке

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference

Logcat

   02-14 16:37:04.648: E/AndroidRuntime(28177): Process: com.raaga.android, PID: 28177
02-14 16:37:04.648: E/AndroidRuntime(28177): java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
02-14 16:37:04.648: E/AndroidRuntime(28177):    at android.content.ComponentName.<init>(ComponentName.java:77)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at android.content.Intent.<init>(Intent.java:3996)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at com.raaga.fragments.SigninFragment.afterSubmitClicked(SigninFragment.java:152)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at com.raaga.asynctask.SignInAsyncTask.onPostExecute(SignInAsyncTask.java:92)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at com.raaga.asynctask.SignInAsyncTask.onPostExecute(SignInAsyncTask.java:1)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at android.os.AsyncTask.finish(AsyncTask.java:632)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at android.os.AsyncTask.access$600(AsyncTask.java:177)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at android.os.Handler.dispatchMessage(Handler.java:102)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at android.os.Looper.loop(Looper.java:135)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at android.app.ActivityThread.main(ActivityThread.java:5221)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at java.lang.reflect.Method.invoke(Native Method)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at java.lang.reflect.Method.invoke(Method.java:372)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
02-14 16:37:04.648: E/AndroidRuntime(28177):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

Я судил меня и исследовал в Google. Но я не получил решения. Кто-либо мог помочь на этом?

62
задан 14 February 2015 в 14:27

8 ответов

В моем случае ошибка произошла в Fragment на этой строке:

Intent intent = new Intent(getActivity(), SecondaryActivity.class);

Это произошло, когда я дважды щелкнул по объекту, который инициировал код выше так два SecondaryActivity.class, операции были запущены одновременно, один сверху другого. Я закрыл вершину SecondaryActivity.class действие путем нажатия кнопки "Назад", которая инициировала вызов к getActivity() в SecondaryActivity.class, который прибыл в передний план. Вызов к getActivity() возвратился null. Это - некоторая странная ошибка Android, таким образом, этого обычно не должно происходить. Можно заблокировать щелчки после того, как пользователь нажал однажды.

4
ответ дан 31 October 2019 в 14:14

У меня была та же проблема при попытке показать Тост во фрагменте.

После некоторой отладки я узнал, что удалял фрагмент перед вызовом:

Toast.makeText(getContext(), "text", Toast.LENGTH_SHORT).show();

, поскольку фрагмент был удален , контекст стал пустым, вызвав исключение.

Простое решение: звоните getContext() прежде, чем удалить фрагмент.

2
ответ дан 31 October 2019 в 14:14

Мой класс не, расширяется на Activiti. Я решил проблему этот путь.

class MyOnBindViewHolder : LogicViewAdapterModel.LogicAdapter {
          ...
 holder.title.setOnClickListener({v->
                v.context.startActivity(Intent(context,  HomeActivity::class.java))
            })
          ...
    }
1
ответ дан 31 October 2019 в 14:14

Вы решаете проблему с попыткой / выгода. Этот катастрофический отказ происходит, когда пользователь закрывает приложение перед намерением запуска.

try
{
    Intent mIntent = new Intent(getActivity(),MusicHome.class);
    mIntent.putExtra("SigninFragment.user_details", bundle);
    startActivity(mIntent);
}
catch (Exception e) {
    e.printStackTrace();
}
0
ответ дан 31 October 2019 в 14:14

Для меня проблема состояла в том, что я передавал Действие конструктору, не Контекст

public Adapter(Activity activity, List<MediaItem> items, boolean can) {
    mItems = items;
    canEdit = can;
    mActivity = activity;
}

и использовал это действие для getDefaultSharedPreferences (), таким образом, я изменил Действие на Контекст, и я все еще вызывал конструктора Adapter с MainActivity.this

4
ответ дан 31 October 2019 в 14:14

Ответы на этот вопрос помогли мне найти свою проблему, но мой источник отличался, таким образом, надо надеяться, это может пролить свет на кого-то находящего эту страницу, ищущую ответы на 'случайный' катастрофический отказ контекста:

я указал объект SharedPreferences и попытался инстанцировать его в, он - объявление уровня класса, как так:

public class MyFragment extends FragmentActivity {
    private SharedPreferences sharedPref =
        PreferenceManager.getDefaultSharedPreferences(this);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //...

Ссылка this, прежде чем onCreate вызвал "java.lang. NullPointerException: Попытка вызвать виртуальный метод 'java.lang. Строка android.content. Context.getPackageName ()' на ссылке несуществующего объекта" ошибка для меня.

Инстанцирование объекта в onCreate () решило мою проблему, как так:

public class MyFragment extends FragmentActivity {
    private SharedPreferences sharedPref ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //...
        sharedPref = PreferenceManager.getDefaultSharedPreferences(this);

Hope, которая помогает.

24
ответ дан 31 October 2019 в 14:14

уровень API 23.

андроида Использует

getContext ()

вместо

getActivity ()

, getActivity () дает родительское Действие, Объект контекста

Здесь, можно использовать

MyActivity.this

вместо [1 112]

getActivity () / getApplicationContext ()

19
ответ дан 31 October 2019 в 14:14

Только необходимо сделать это:

Intent myIntent = new Intent(MainActivity.this, nextActivity.class);
4
ответ дан 31 October 2019 в 14:14

Другие вопросы по тегам:

Похожие вопросы: