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错误,所以它通常不应该发生。