0
public class Whatever {
    static double d;
    static char c;
    static String[] s;
    static char[] b;
    static double[] dd;
    static Whatever w;
    static Whatever[] ww;

    public static void main(String[] args) {
        System.out.println(Whatever.d); //prints out 0.0
        System.out.println("hi"+Whatever.c+"hi"); //prints out hi hi
        System.out.println(s); //prints out null
        System.out.println(b); //null pointer exception!
        System.out.println(Whatever.dd);
        System.out.println(Whatever.w);
        System.out.println(Whatever.ww);
    }
}

为什么会出现空指针异常?

如果可以的话,请根据记忆进行解释,但是我对记忆有基本的了解,所以也不要太深入。

4

3 回答 3

1

好的,现在您已经发布了完整的代码,它更容易提供帮助!当您使用原始数组调用时,通常会发生这种情况:PrintStream.println

String s = String.valueOf(x);

最终会这样做:

return (obj == null) ? "null" : obj.toString();

如您所见,提供的对象为 null 的可能性已被显式处理。PrintStream但是,该类有一个特定的重载,适用于 char 数组。这是逻辑的粗略跟踪:

write(cbuf, 0, cbuf.length);

cbuf给定的 char 数组在哪里。正如你所看到的,它试图引用字符数组的长度,如果数组没有被初始化,它将被 NPE 炸毁。这是实施中奇怪且不幸的不一致。

因此,现在您了解NPE 发生的原因- 修复它只需在尝试打印之前初始化 char 数组。

于 2013-04-02T01:19:08.050 回答
0

这里有几个问题:

1. You're not allocating any space for `int x`
2. If you want to print the contents of `x`, it should be `x.toString()`
3. What did you expect the output to be from your sample code?

我猜#3 不是你实际使用的,我建议你展示你的真实代码以获得真正的答案:)

希望这可以为您澄清一点。

$ cat Whatever.java 
public class Whatever {
    static final int MAX = 5;
    int[] x = new int[MAX]; // allocate array to sizeof '5'

    public Whatever() {
        // do stuff
    }

    public void addStuff() {
        for(int i=0; i<MAX; i++)
            x[i] = i + 2;

    }

    public void printX() {
        for(int i=0; i<MAX; i++)
            System.out.println(i + ": " + x[i]);

    }

    public static void main(String[] args){
        Whatever w = new Whatever();  // new instance of 'Whatever'
        w.addStuff();                 // add some ints to the array
        w.printX();                   // print out the array
        // print the Array 'x'
        System.out.println("Array: " + w.x);
    }
}
$ java Whatever 
0:  2
1:  3
2:  4
3:  5
4:  6
Array: [I@870114c
于 2013-04-02T00:16:49.927 回答
0

问题基本上根源于如何PrintStream.println(...)实施。除了char[],原始数组被视为java.lang.Object。所以println使用的重载是println(Object). 在下面,打印对象涉及调用对象的toString(). 因此,NPE。

如果你想防御空值,你应该考虑使用String.valueOf(Object).

于 2013-04-02T00:51:43.303 回答