几天前,我已经在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调用。

这只是活动生命周期中随时使用的AddressEditorActivity方法的列表,或者这意味着这些方法彼此调用?但是setEntryStart不会调用setCategory,反之亦然...

是否必须自上而下或自下而上阅读此方法列表?从setEntryStart开头,将列表一直跟踪到closeEditor(启动活动,设置属性和视图模型,编辑数据,保存数据,关闭编辑器)是有意义的,但是access$XY条目是什么意思?他们对我没有任何意义。

我是否必须在NullPointerExceptionsetEntryStart(可能是)中或完全不同的位置寻找access$36(...)的可能原因?

非常感谢您的帮助!

编辑:
@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.before(_entryStart)为空,则不会调用_entryEnd,不是吗?

最佳答案

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

因此,您必须从上至下阅读。

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

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

08-18 12:36