空对象引用上的android.content.Context.getPackageName()'

问题描述 投票:57回答:8

嗨,我正在使用实现接口的Fragments。

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
    }

}

在执行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上进行过探索。但我没有得到任何解决方案。有人可以帮忙吗?

android android-fragments fragment
8个回答
33
投票

我发现了我所做的错误。我们需要从覆盖方法OnAttach()获取活动实例例如,

public MainActivity activity;

@Override
public void onAttach(Activity activity){
    this.activity = activity;
}

然后将活动作为上下文传递如下。

Intent mIntent = new Intent(activity, MusicHome.class);

21
投票

这个问题的答案帮助我找到了我的问题,但我的来源不同,所以希望这可以揭示有人找到这个页面寻找“随机”上下文崩溃的答案:

我已经指定了一个SharedPreferences对象,并尝试在它的类级声明中实例化它,如下所示:

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

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

在onCreate之前引用this导致“java.lang.NullPointerException:尝试在空对象引用上调用虚方法'java.lang.String 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);

希望有所帮助。


18
投票

android API等级23。

使用

的getContext()

代替

getActivity()

getActivity()给出父Activity,一个Context对象

在这里你可以使用

MyActivity.this

代替

getActivity()/ getApplicationContext()


4
投票

对我来说问题是我将Activity传递给构造函数,而不是Context

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

并使用此活动getDefaultSharedPreferences(),所以我将Activity更改为Context,我仍然使用MainActivity.this调用Adapter构造函数。


3
投票

你只需要这样做:

Intent myIntent = new Intent(MainActivity.this, nextActivity.class);

3
投票

在我的情况下,错误发生在这一行的Fragment内:

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

它发生在我双击一个触发上面代码的项目时,所以两个SecondaryActivity.class活动同时启动,一个在另一个上面。我通过按下后退按钮关闭了顶部的SecondaryActivity.class活动,该按钮触发了getActivity()SecondaryActivity.class调用。对getActivity()的召唤让null回归。这是一种奇怪的Android bug,所以通常不应该发生。


1
投票

我的课程没有扩展到Activiti。我这样解决了问题。

class MyOnBindViewHolder : LogicViewAdapterModel.LogicAdapter {
          ...
 holder.title.setOnClickListener({v->
                v.context.startActivity(Intent(context,  HomeActivity::class.java))
            })
          ...
    }

0
投票

您可以使用try / catch解决问题。当用户在开始意图之前关闭应用程序时,会发生此崩溃。

try
{
    Intent mIntent = new Intent(getActivity(),MusicHome.class);
    mIntent.putExtra("SigninFragment.user_details", bundle);
    startActivity(mIntent);
}
catch (Exception e) {
    e.printStackTrace();
}
© www.soinside.com 2019 - 2024. All rights reserved.