java - 如何读取Android崩溃日志?

标签 java android eclipse nullpointerexception crash-dumps

几天前,我在 Google Play 商店发布了我的第一个 Android 应用程序。现在开发者控制台中提供了崩溃日志,我正在尝试找出导致崩溃的原因。尽管我未混淆堆栈跟踪,但我很难理解崩溃日志:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.MyApp/com.example.MyApp.UI.AddressEditor.AddressEditorActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)

Caused by: java.lang.NullPointerException
at com.example.MyApp.UI.AddressEditor.AddressEditorActivity.void setEntryStart(java.util.Date)(Unknown Source)
                                                                    void setCategory(com.example.MyApp.Common.Model.BookingDetail)
                                                                    void loadViewModel(android.os.Bundle)
                                                                    void putAddresDetailUUID(java.lang.String,com.example.MyApp.Common.Model.AddressDetail,android.os.Bundle)
                                                                    void putDate(java.lang.String,java.util.Date,android.os.Bundle)
                                                                    void doSave(com.example.MyApp.UI.AddressEditor.AddressEditorActivity$OnEditorTaskCompleteListener)
                                                                    void saveRecurringTemplate(boolean,boolean,boolean,com.example.MyApp.UI.AddressEditor.AddressEditorActivity$OnEditorTaskCompleteListener)
                                                                    void closeEditor(boolean,boolean,boolean)
                                                                    void access$0(com.example.MyApp.UI.AddressEditor.AddressEditorActivity)
                                                                    void access$5(com.example.MyApp.UI.AddressEditor.AddressEditorActivity,java.lang.String)
                                                                    void access$6(com.example.MyApp.UI.AddressEditor.AddressEditorActivity,android.view.View)
                                                                    void access$7(com.example.MyApp.UI.AddressEditor.AddressEditorActivity,java.util.Date)
                                                                    void access$11(com.example.MyApp.UI.AddressEditor.AddressEditorActivity,com.example.MyApp.Common.Model.Enums.Priorities)
                                                                    void access$13(com.example.MyApp.UI.AddressEditor.AddressEditorActivity,com.example.MyApp.Common.Model.AddressDetail)
                                                                    void access$25(com.example.MyApp.UI.AddressEditor.AddressEditorActivity,double)
                                                                    void access$27(com.example.MyApp.UI.AddressEditor.AddressEditorActivity,boolean)
                                                                    void access$28(com.example.MyApp.UI.AddressEditor.AddressEditorActivity,boolean,boolean,boolean)
                                                                    void access$36(com.example.MyApp.UI.AddressEditor.AddressEditorActivity,boolean,boolean,boolean,com.example.MyApp.UI.AddressEditor.AddressEditorActivity$OnEditorTaskCompleteListener)
at com.example.MyApp.UI.AddressEditor.AddressEditorActivity.void onCreate(android.os.Bundle)(Unknown Source)
at android.app.Activity.performCreate(Activity.java:5231)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)
... 11 more

显然崩溃是由 NullPointerException 引起的,但是如何找到确切的源头呢?我必须自上而下或自下而上读取堆栈跟踪吗?到目前为止,我认为跟踪有两个部分:

  • “dalvik.system.NativeStart.main(Native Method)”是堆栈中的第一个元素。
  • 从这里开始,堆栈中的所有其他方法,直到 android.app.ActivityThread.performLaunchActivity 都已被调用。
  • 对吗?

  • 当应用执行 android.app.ActivityThread.performLaunchActivity 时,发生了 NullPointerException。异常的确切位置在日志的第二部分(从底行开始)中指定。

  • 我自己的代码的第一个方法是调用的com.example.MyApp.UI.AddressEditor.AddressEditorActivity.void onCreate
  • 对吗?

接下来的几行我不明白:此处列出的方法,例如 void setEntryStartvoid setCategoryAddressEditorActivity 的一部分> 但不直接从 onCreate 调用。

这是否只是在 Activity 生命周期中任何时间使用过的AddressEditorActivity方法列表,或者这是否意味着这些方法相互调用?但是 setEntryStart 不会调用 setCategory ,反之亦然...

必须自上而下或自下而上阅读此方法列表吗?从 setEntryStart 开始,按照列表一直到 closeEditor(启动 Activity 、设置属性和 View 模型、编辑数据、保存数据、关闭编辑器)是有意义的,但是access$XY条目意味着什么?它们对我来说没有任何意义。

我是否必须在 setEntryStartaccess$36(...) 中查找 NullPointerException 的可能原因(什么会导致那是)还是在完全不同的位置?

非常感谢您的帮助!

编辑: @shayan pourvatan,@Pankaj

这是setEntryStart的代码

private Date _entryStart;
private void setEntryStart(Date start) {
    _entryStart = start;
    if (_entryEnd != null && _entryStart != null && _entryEnd.before(_entryStart))
        _entryEnd = _entryStart;
}

private Date _entryEnd;
private void setEntryEnd(Date end) {
    _entryEnd = end;
    if (_entryEnd != null && _entryStart != null && _entryEnd.before(_entryStart))
        _recurringStart = _entryEnd;
}

NullPointerException 的唯一可能是 _entryEnd.before(_entryStart),其中 _entryEnd 为 null,不是吗?但是,如果 _entryEnd != null 之前被检查过,据我所知,如果条件失败,则 if 语句的进一步评估将被取消。因此,如果 _entryEnd 为 null,则不会调用 _entryEnd.before(_entryStart),不是吗?

最佳答案

这些是堆栈跟踪,方法是从堆栈调用的,堆栈是 LIFO(后进先出)

所以,你必须从上到下阅读。

EG:如果你从 main() 调用 m1() ,从 m1() 调用 m2() ,从 m2() 调用 m3() ,堆栈将是

main()->m1()->m2()->m3()

关于java - 如何读取Android崩溃日志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26211083/

相关文章:

java - 无法在 32 位 Windows 机器中创建 grpc 连接

java - Play Framework 2.0 中的动态模板

java - 根据屏幕方向在微调器和 ListView 之间切换

Android:使用 DrawableCompat 进行着色

java - acm.jar ECLIPSE 在 Linux 上的问题

java - Tomcat & Maven : "Publishing failed with multiple errors Error reading file"

java - 无法从 START_OBJECT 标记 String.class 反序列化 java.lang.String 的实例

java - com.sun.xml.ws.message.saaj.SAAJHeader 无法转换为 com.sun.xml.ws.security.opt.impl.outgoing.SecurityHeader

android - fragment.getview() 从 Activity 中返回 null

eclipse - eclipse 3.6 中的 "inspect"窗口不记得被调整大小