有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何读取Android崩溃日志?

几天前,我在谷歌Play商店发布了我的第一个Android应用程序。现在,开发人员控制台中有一个崩溃日志,我正试图找出导致崩溃的原因。虽然我取消了堆栈跟踪的混淆,但我很难理解崩溃日志:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.MyApp/com.example.MyApp.UI.AddressEditor.AddressEditorActivity}: java.lang.NullPointerException
at 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
at 安卓.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
at 安卓.app.ActivityThread.access$800(ActivityThread.java:135)
at 安卓.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at 安卓.os.Handler.dispatchMessage(Handler.java:102)
at 安卓.os.Looper.loop(Looper.java:136)
at 安卓.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.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.安卓.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(安卓.os.Bundle)
                                                                    void putAddresDetailUUID(java.lang.String,com.example.MyApp.Common.Model.AddressDetail,安卓.os.Bundle)
                                                                    void putDate(java.lang.String,java.util.Date,安卓.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,安卓.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(安卓.os.Bundle)(Unknown Source)
at 安卓.app.Activity.performCreate(Activity.java:5231)
at 安卓.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
at 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)
... 11 more

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

  • “达尔维克。系统本土艺术。main(本机方法)“”是堆栈中的第一个元素
  • 从这里开始,堆栈中的所有其他方法都被调用了安卓.app.ActivityThread.performLaunchActivity
  • 对吗

  • 应用程序正在执行安卓.app.ActivityThread.performLaunchActivity时发生NullPointerException。异常的确切位置在日志的第二部分中指定,从底线开始

  • 我自己代码的第一个方法是调用
  • 对吗

下面几行我不明白:这里列出的方法,如void setEntryStartvoid setCategoryAddressEditorActivity的原因部分,但不是直接从onCreate调用的

这仅仅是活动生命周期中任何时间使用的AddressEditorActivity方法列表,还是这意味着这些方法相互调用?但是setEntryStart不调用setCategory,反之亦然

您必须自上而下或自下而上阅读此方法列表吗?从setEntryStart开始,沿着列表一直到closeEditor(启动活动、设置属性和查看模型、编辑数据、保存数据、关闭编辑器)都是有意义的,但是access$XY项意味着什么?它们对我来说毫无意义

我是否必须在{}或{}或在完全不同的位置查找{}的可能原因

非常感谢你的帮助

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


共 (1) 个答案

  1. # 1 楼答案

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

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

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

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