【问题标题】:Android Getting NullPointerException before OnCreate is called of my MainActivity我的 MainActivity 调用了 Android 在 OnCreate 之前获取 NullPointerException
【发布时间】:2013-07-30 22:48:51
【问题描述】:

我正在开发一个 Android 应用程序,并且在修改 Fragment 的代码时,我现在每次尝试启动该应用程序时都会遇到严重的崩溃。奇怪的是,NullPointerException 在它真正到达我的代码之前就被抛出,因为当我进入调试模式时,异常在我到达 MainActivity 的 OnCreate() 之前被抛出。特别令人费解的是,我并没有在 MainActivity 和它的布局中弄乱任何东西。

下面的堆栈跟踪。有什么想法吗?

07-30 15:39:52.753: E/AndroidRuntime(5348): FATAL EXCEPTION: main
07-30 15:39:52.753: E/AndroidRuntime(5348): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.legacy/com.example.legacy.MainActivity}: java.lang.NullPointerException
07-30 15:39:52.753: E/AndroidRuntime(5348):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)
07-30 15:39:52.753: E/AndroidRuntime(5348):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
07-30 15:39:52.753: E/AndroidRuntime(5348):     at android.app.ActivityThread.access$700(ActivityThread.java:143)
07-30 15:39:52.753: E/AndroidRuntime(5348):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1241)
07-30 15:39:52.753: E/AndroidRuntime(5348):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-30 15:39:52.753: E/AndroidRuntime(5348):     at android.os.Looper.loop(Looper.java:137)
07-30 15:39:52.753: E/AndroidRuntime(5348):     at android.app.ActivityThread.main(ActivityThread.java:4950)
07-30 15:39:52.753: E/AndroidRuntime(5348):     at java.lang.reflect.Method.invokeNative(Native Method)
07-30 15:39:52.753: E/AndroidRuntime(5348):     at java.lang.reflect.Method.invoke(Method.java:511)
07-30 15:39:52.753: E/AndroidRuntime(5348):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004)
07-30 15:39:52.753: E/AndroidRuntime(5348):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771)
07-30 15:39:52.753: E/AndroidRuntime(5348):     at dalvik.system.NativeStart.main(Native Method)
07-30 15:39:52.753: E/AndroidRuntime(5348): Caused by: java.lang.NullPointerException
07-30 15:39:52.753: E/AndroidRuntime(5348):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:656)
07-30 15:39:52.753: E/AndroidRuntime(5348):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
07-30 15:39:52.753: E/AndroidRuntime(5348):     at android.support.v4.app.Fragment.performStart(Fragment.java:1481)
07-30 15:39:52.753: E/AndroidRuntime(5348):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:941)
07-30 15:39:52.753: E/AndroidRuntime(5348):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
07-30 15:39:52.753: E/AndroidRuntime(5348):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1070)
07-30 15:39:52.753: E/AndroidRuntime(5348):     at android.support.v4.app.FragmentManagerImpl.dispatchStart(FragmentManager.java:1866)
07-30 15:39:52.753: E/AndroidRuntime(5348):     at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:568)
07-30 15:39:52.753: E/AndroidRuntime(5348):     at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1178)
07-30 15:39:52.753: E/AndroidRuntime(5348):     at android.app.Activity.performStart(Activity.java:5189)
07-30 15:39:52.753: E/AndroidRuntime(5348):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2083)

提前致谢。

【问题讨论】:

标签: android


【解决方案1】:

如果这是 Honeycomb 之前的版本,那么您必须使用支持库(我认为您已经在这样做了)。

如果您使用的是支持库片段,那么您必须使用 FragmentActivity 而不是从中启动片段的 Activity。

如果您使用的是 setRetainInstance(true),那么请您将其删除并重试。

(这是我建议的实际上有助于解决问题的链接):

Android FragmentManager BackStackRecord.run throwing NullPointerException

【讨论】:

  • 我已经在使用支持库,并且我的 MainActivity 已经扩展了 FragmentActivity。
  • 好。请查看可能相关的内容:stackoverflow.com/questions/13393693/…
  • 哦 - 你在使用 setRetainInstance(true) 吗?
  • 我不会在任何地方手动调用 setRetainInstance(true),所以除非有别的东西在调用它,否则我不会。
  • 谢尔顿,就是这样。显然,任何对 FragmentTransaction 的调用(如 FragmentTransaction.remove(null))都会使应用程序崩溃并阻止您进行调试。讨厌的错误,我很惊讶他们允许这样做。
【解决方案2】:

遇到了同样的问题,上面的建议都没有帮助我。 对我有帮助的是检查我的片段的导入:

导入 android.os.Bundle;
导入 android.util.Log;
导入 android.view.LayoutInflater;
导入 android.view.View;
导入 android.view.ViewGroup;
导入android.app.Fragment;

公共类 SelectionFragment 扩展片段{

可以看出,Fragment 的导入是 android.app.Fragment 什么时候应该是 android.support.v4.app.Fragment
所以更改代码如下解决了我的问题:

导入 android.os.Bundle;
导入 android.util.Log;
导入 android.view.LayoutInflater;
导入 android.view.View;
导入 android.view.ViewGroup;
导入android.support.v4.app.Fragment;

公共类 SelectionFragment 扩展片段{

第一个导入可能是 Eclipse 自动添加的。

【讨论】:

  • 解决我的问题的方法实际上是由另一个用户作为评论发布的(显然他们选择删除他们的评论?直到现在我才注意到这一点)。但由于这似乎是一个修复,我认为值得保留它。
【解决方案3】:

您可能正尝试在 Android 版本低于 HoneyComb 3.0 的模拟器上运行 fragment activity。因此,要运行片段活动,您必须拥有运行 Android 3.0 或更高版本的手机或模拟器。您必须在项目中添加一个支持库android-support-v4.jar。合并该库后,此问题将消失。

【讨论】:

  • 支持库不是已经存在了吗?你可以在堆栈转储中看到它
  • 正如talkol 所说,我的项目中已经包含了该库。此外,我之前已经能够运行这个应用程序,所以我不确定为什么会突然弹出这个异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
相关资源
最近更新 更多