【发布时间】:2014-10-06 06:44:03
【问题描述】:
几天前,我在 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 setEntryStart 或void setCategory 是AddressEditorActivity 的一部分,但不是直接从onCreate 调用的。
这只是AddressEditorActivity 在活动生命周期中任何时间使用的方法列表,还是这意味着这些方法相互调用?但是setEntryStart 不会调用setCategory,反之亦然...
是否必须自上而下或自下而上阅读此方法列表?从setEntryStart 开始,按照列表向下到closeEditor(启动活动、设置属性和查看模型、编辑数据、保存数据、关闭编辑器)是有意义的,但是access$XY 条目是什么意思?它们对我没有任何意义。
我是否必须在setEntryStart 或access$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 为空,不是吗?但是,如果之前检查过_entryEnd != null,据我所知,如果条件失败,则取消对 if 语句的进一步评估。因此,如果_entryEnd 为空,则不会调用_entryEnd.before(_entryStart),是吗?
【问题讨论】:
-
我觉得你在
com.example.MyApp.UI.AddressEditor.AddressEditorActivity.void setEntryStart(java.util.Date)(Unknown Source)有问题 -
是的,您必须查看 setEntryStart(),您可能将某些值设置为 null。
-
@shayan pourvatan,@Pankaj:我已经更新了我的问题以发布
setEntryStart的代码。我看不到Ecxeption应该出现在哪里。 -
if (_entryEnd != null && _entryStart != null){ if(_entryEnd.before(_entryStart)) _entryEnd = _entryStart; }
-
我明白你的意思,但我发现的所有资料都说 Java 对 && 和 || 使用短路评估在 if 语句中。因此,
_entryEnd.before(_entryStart)仅在_entryEnd和_entryStart都不为空时才被评估。那么使用两个 if 子句会有什么不同呢?
标签: java android eclipse nullpointerexception crash-dumps