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 } } 

这个方法在执行一个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中探索。 但是我没有得到任何解决scheme。 有没有人可以帮忙?

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

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

然后按照以下方式传递活动。

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

这个问题的答案帮助我find了我的问题,但是我的源代码是不同的,所以希望这可以为find本页寻找“随机”上下文崩溃的答案的人提供帮助:

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

 public class MyFragment extends FragmentActivity { private SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //... 

在onCreate之前引用this对null引起的“null对象引用”错误的“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); 

希望有所帮助。

android API级别23。

使用

的getContext()

代替

getActivity()

2. 强壮的文字

getActivity()给出了活动的上下文。 在这里你可以使用

MyActivity.this

代替

getActivity()/ getApplicationContext()

你只需要这样做:

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

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

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

并使用此活动getDefaultSharedPreferences(),所以我将活动更改为上下文,我仍然与MainActivity.this调用适配器的构造函数

你用try / catch来解决这个问题。 当用户在启动意图之前closures应用程序时,会发生这种崩溃。

 try { Intent mIntent = new Intent(getActivity(),MusicHome.class); mIntent.putExtra("SigninFragment.user_details", bundle); startActivity(mIntent); } catch (Exception e) { e.printStackTrace(); } 

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

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

当我双击一个触发上面的代码的项目时,就发生了这种情况,所以两个SecondaryActivity.class活动同时启动,一个在另一个之上。 我closures了顶级的SecondaryActivity.class活动,通过按下后面的button触发对前台进行的SecondaryActivity.class中的getActivity()的调用。 对getActivity()的调用返回null 。 这是一个奇怪的Android错误,所以它通常不应该发生。