如何阅读Android崩溃日志?

问题描述:

我几天前在Google Play商店发布了我的第一个Android应用程序。现在,开发者控制台中提供了一个崩溃日志,我正试图找出导致崩溃的原因。虽然我未混淆的堆栈跟踪我有困难,了解崩溃日志:如何阅读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(本地方法)'是堆栈中的第一个元素。
  • 从这里盯着堆栈中的所有其他方法,最多调用android.app.ActivityThread.performLaunchActivity
  • 对不对?

  • 在执行应用程序时android.app.ActivityThread.performLaunchActivity发生了NullPointerException。从底线开始的日志的第二部分指定了例外的确切位置。

  • 我自己的代码的第一梅索德是com.example.MyApp.UI.AddressEditor.AddressEditorActivity.void onCreate那个叫
  • 对吗?

下一行我不明白:此处列出,像void setEntryStartvoid setCategory的methodes是AddressEditorActivity原因一部分,但不是直接从onCreate调用。

是已经活动的生命周期中的任何时间使用或者这是否意味着中AddressEditorActivity methodes的这只是一个列表,这些methodes叫对方吗?但​​不叫setCategory或反之亦然...

必须阅读这种方法列表自上而下或自下而上吗?从​​开始,将列表按照closeEditor(开始活动,设置属性和视图模型,编辑数据,保存数据,关闭编辑器)列出是有意义的,但access$XY条目的含义是什么?他们对我没有任何意义。

我需要寻找NullPointerException​​或access$36(...)(会是什么)或完全不同的位置的可能原因吗?

非常感谢您的帮助!

编辑: @shayan pourvatan,@Pankaj

这是​​

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是空,是不是?但是,如果_entryEnd != null之前被检查过,并且据我所知,如果条件失败,if-statment的进一步评估将被取消。因此如_entryEnd为空,则不调用_entryEnd.before(_entryStart),是吗?

+0

我认为你有问题'com.example.MyApp.UI.AddressEditor.AddressEditorActivity.void setEntryStart(java.util.Date)(Unknown Source)' – 2014-10-06 06:58:22

+0

是的,你必须查看setEntryStart(),可能有一些值设置为null。 – Pankaj 2014-10-06 06:58:54

+0

@ shayan pourvatan,@Pankaj:我已更新我的问题以发布'setEntryStart'的代码。我看不到'Ecxeption'应该发生在哪里。 – 2014-10-06 07:12:27

这些堆栈跟踪和方法,从栈和堆称为是LIFO(后进先出)

所以,你必须从上往下读。

EG:如果调用从主M1()(),从平方米从M1,M2,()()和m3()()堆栈将

主() - > M1() - > m2() - > m3()

+1

谢谢!当然,我知道一个堆栈是LIFO,但是如前所述,当我从头到尾读取堆栈跟踪时,堆栈跟踪没有任何意义。首先,似乎有两部分必须分开阅读。其次,第二部分的方法不会互相呼叫。读取'setCategory - > setEntryStart'没有意义,因为'setCategory'没有调用'setEntryStart' ... – 2014-10-06 07:17:11