Java Android NullPointerException-调试特定行
如果我有这样一句话:Java Android NullPointerException-调试特定行,java,android,debugging,nullpointerexception,Java,Android,Debugging,Nullpointerexception,如果我有这样一句话: var.getSomething().getSomethingElse().setNewValue(stuff.getValue().getWhatever()); 如果该行创建了一个NullPointerException,有没有办法找出哪个方法返回null值 我相信我能够在每个点上分割线,并得到显示哪条线失败的异常。但是我再也不能让它工作了(也许我记错了) 这样写是唯一好的调试方法吗 a = var.getSomething(); b = a.getSomehingE
var.getSomething().getSomethingElse().setNewValue(stuff.getValue().getWhatever());
如果该行创建了一个NullPointerException
,有没有办法找出哪个方法返回null值
我相信我能够在每个点上分割线,并得到显示哪条线失败的异常。但是我再也不能让它工作了(也许我记错了)
这样写是唯一好的调试方法吗
a = var.getSomething();
b = a.getSomehingElse();
c = stuff.getValue();
d = c.getWhatever();
b.setNewValue(d);
有了这个,我应该能够很容易地看到异常发生的地方。但这样写感觉既低效又难看
我使用安卓工作室。以前使用过Eclipse,但不久前搬到了Android Studio。您可能希望将每个部分都放到“手表”中:
但是我很确定Eclipse和Android Studio都可以让您通过选择您感兴趣的部分(如果您处于调试模式)来检查内容。我能给您的最好建议是对所有具有返回值的方法使用和注释。它不会帮助您获得空指针所在的行,但有助于防止将来出现这种情况 所以,若该方法可能返回
null
,并且您在调用序列中有它,那个么您将从Android Studio收到关于此的警告。在这种情况下,最好中断序列并检查null
例如:
private static class Seq {
private final Random rand = new Random();
@NonNull
public Seq nonNull() {
return new Seq();
}
@Nullable
public Seq nullable() {
return rand.nextInt() % 100 > 50 ? new Seq() : null;
}
}
如果您编写new Seq().nonNull().nonNull().nullable().nonNull()代码>您将从IDE收到警告:
Method invocation `new Seq().nonNull().nonNull().nullable().nonNull()` may produce 'java.lang.NullPointerException'
在这种情况下,最好的解决方案是更改代码,如下所示:
Seq seq = new Seq().nonNull().nonNull().nullable();
if (seq != null) {
seq.nonNull();
}
别忘了将其添加到Gradle构建脚本中
compile 'com.android.support:support-annotations:22.+'
我对你做这件事的方式不太肯定。这使得您的代码紧密耦合,不可进行单元测试
var.getSomething().getSomethingElse().setNewValue(stuff.getValue().getWhatever());
而是做一些类似的事情
var.getSomething();
从内部获取某些东西会做任何你作为其中一部分正在做的事情
getSomethingElse().setNewValue(stuff.getValue().getWhatever())
setNewValue(stuff.getValue().getWhatever())
同样地,getSomethingElse()
应该执行您作为一部分正在做的任何事情
getSomethingElse().setNewValue(stuff.getValue().getWhatever())
setNewValue(stuff.getValue().getWhatever())
为什么不使用调试器来估计每个调用的值呢?在eclipse中,您可以在调试模式下选择一个特定的部分,然后右键单击“inspect”,您将从该部分获得返回值。我相信logcat会显示NPE发生的确切位置。(IMO)你必须按照日志进行操作。我可能应该更好地阅读调试工具的使用。我使用的是android studio,大多数例外情况都很难重现。通常,用户会以一些奇怪的方式获得这些异常。因此,在我的硬件上调试可能很困难。不,我只看到logcat显示了除了行号以外的任何东西。在android studio中,只需在调试模式下以相同的运行配置运行,当您来到这一行时,就可以写入行中的所有值。您还可以右键单击并计算鼠标选中的表达式。安静,谢谢。这是最接近解决方案的方法。我成功地重现了异常,然后这起了作用。问题是要知道如何重现错误。为了做到这一点,我必须将我的行分割成多个较短的行,这样我才能准确地识别异常发生的位置。我喜欢这个想法。但我认为我不能把它应用到我的申请中。但将来可能会用到它。谢谢