在方法调用链中查找null

Chr*_*dal 5 java null exception

我正在寻找一种快速的方法来确定链的哪个部分为空.

一个例子来说明这一点:

public class Chain {
    private Chain chain;

    public Chain returnChain() {
        return chain;
    }

    public void addChain(Chain chain) {
        this.chain=chain;
    }

    public String toString() {
        return "Hello!";
    }

    public static void main(String[] args) {
        Chain c1 = new Chain();
        c1.addChain(new Chain());

        System.out.println(c1.returnChain().returnChain().returnChain().returnChain());
    }
}
Run Code Online (Sandbox Code Playgroud)

这显然会抛出一个NullPointerException.(我知道如何更改代码以使链接的哪一部分显而易见NullPointerException,但我想用现有代码来解决这个问题.)

Dav*_*ave 2

在典型 NPE 的堆栈跟踪中,您将获得它发生的行号。因此,假设System.out.println(c1.returnChain().returnChain().returnChain().returnChain());位于第 144 行(只是随机选择),您的 NPE 堆栈跟踪应该类似于:

java.lang.NullPointerException
  at your.package.Chain(Chain.java:144)
Run Code Online (Sandbox Code Playgroud)

因此,如果您将链式调用放在多行上,它应该会告诉您异常在哪里。

我写了这个小例子:

package bla;

public class Something {
    public static int count = 0;
    public Something get() {
        if(count == 2) {
            return null;
        }
        ++count;
        return new Something();
    }

    public static void main(String[] args){
        Something something = new Something();
        Something test = something.get()
                                .get()
                                    .get()
                                        .get() // Should throw NPE
                                            .get()
                                                .get();
    }
}
Run Code Online (Sandbox Code Playgroud)

它给了我 NPE 说:at bla.Something.main(Something.java:18) - 正是 NPE 在链中发生的位置。

截屏...

展示这会是什么样子......