Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android NullPointerException-调试特定行_Java_Android_Debugging_Nullpointerexception - Fatal编程技术网

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中,只需在调试模式下以相同的运行配置运行,当您来到这一行时,就可以写入行中的所有值。您还可以右键单击并计算鼠标选中的表达式。安静,谢谢。这是最接近解决方案的方法。我成功地重现了异常,然后这起了作用。问题是要知道如何重现错误。为了做到这一点,我必须将我的行分割成多个较短的行,这样我才能准确地识别异常发生的位置。我喜欢这个想法。但我认为我不能把它应用到我的申请中。但将来可能会用到它。谢谢