-1
class  CardBoard    
{  
    Short  story = 200;  
    CardBoard  go(CardBoard cb)
    {
        cb = null;  
        return cb;  
    }  

    public static void main(String[] args)   
    {  
        CardBoard  c1 = new  CardBoard();  
        CardBoard  c2 = new  CardBoard();  
        CardBoard  c3 = c1.go(c2);   
        //  expecting  null  pointer  exception      
        c1  =  null;  
        // do stuff;  
    }   
}  
4

7 回答 7

4

注释行中没有 NPE,因为c1andc2不为空。此外,在go方法中cb变量设置为null,但这并不影响实际对象!

CardBoard  c1 = new  CardBoard();  
CardBoard  c2 = new  CardBoard();  
CardBoard  c3 = c1.go(c2);   

这些行之后的情况是:

c1 != null
c2 != null
c3 == null

那么为什么要获得 NPE 呢?

您必须了解参考是什么!像在调用中那样将对象传递给方法go(c2)并在将参数设置为的方法null中不会影响原始对象实例!

就像是:

object c1 = new object();
object c2 = c1;

c1 = null

结果是

c1 == null
c2 != null // !!!
于 2013-03-22T12:10:35.880 回答
3

我不明白你为什么期待 NullPointerException。
基本上你只是想说:
CardBoard c3 = null;

如果你想要 NPE,你可以这样做:
CardBoard c3 = null;
c3.go(c2);

在这里,c3 为空,所以这会抛出一个 NPE,因为你正在尝试这样做:
null.go(...);

于 2013-03-22T12:10:33.220 回答
1

什么时候出现空指针异常?

每当您调用实例方法或访问引用变量(指向)的实例字段时null

于 2013-03-22T12:09:58.717 回答
1

现在,尝试:

public static void main(String[] args)   
{  
    CardBoard  c1 = new  CardBoard();  
    CardBoard  c2 = new  CardBoard();  
    CardBoard  c3 = c1.go(c2);   
    //  expecting  null  pointer  exception      
    c1  =  null;  
    c3.go(c2);
}

看看会发生什么…… ;) 你肯定会得到你的 NPE。

(你必须实际使用你的空指针来获取你的异常)

于 2013-03-22T12:11:15.100 回答
1

NullPointerException 仅在您尝试访问任何方法或变量的引用指向空时才会发生,即 null。

我已更改您的代码以获取 NullPointerException :

class CardBoard {
Short story = 200;

CardBoard go(CardBoard cb) {
    cb = null;
    return cb;
}

public static void main(String[] args) {
    CardBoard c1 = new CardBoard();
    CardBoard c2 = new CardBoard();
    CardBoard c3 = c1.go(c2);
    // expecting null pointer exception
    c1 = null;

    // If you try to call a method or access any member variable with null reference you will get the exception
    c3.story = 20; //NullPointerException will occur

    // do stuff;
}

}

于 2013-03-22T12:22:48.473 回答
1

例如

Class Apple
{
 void applePrint()
 {
  System.out.println("Apple");
 }
}

Class Mango
{
 void mangoPrint()
 {
  System.out.println("Mango");
 }
}

假设在你的代码的某个地方,你做

Apple a;

Mango m;

如果您尝试使用此变量am访问 Class 成员,

a.printApple(); or m.printMango();

它会抛出 NPE

即你定义了类对象的引用变量,但实际上并没有创建它们

Apple a = new Apple(); Mango m = new Mango();

[在我刚接触 Java 时做了很多事情]

于 2013-03-22T12:26:06.290 回答
1
public static void main(String[] args)   
{  
    CardBoard  c1 = new  CardBoard();  
    CardBoard  c2 = new  CardBoard();  
    CardBoard  c3 = c1.go(c2);   // go method is returning 'null' so c3=null
    //  expecting  null  pointer  exception      
    c1  =  null;  
    c3.go(c2);  // you will get NullPointerException here.
}

当您调用go()方法时,c3您将得到NullPointerException

当您为分配给的那些引用变量NullPointerException调用方法时,您将得到。null

于 2013-03-22T12:51:20.277 回答