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;
}
}
7 回答
注释行中没有 NPE,因为c1
andc2
不为空。此外,在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 // !!!
我不明白你为什么期待 NullPointerException。
基本上你只是想说:
CardBoard c3 = null;
如果你想要 NPE,你可以这样做:
CardBoard c3 = null;
c3.go(c2);
在这里,c3 为空,所以这会抛出一个 NPE,因为你正在尝试这样做:
null.go(...);
什么时候出现空指针异常?
每当您调用实例方法或访问引用变量(指向)的实例字段时null
。
现在,尝试:
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。
(你必须实际使用你的空指针来获取你的异常)
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;
}
}
例如
Class Apple
{
void applePrint()
{
System.out.println("Apple");
}
}
Class Mango
{
void mangoPrint()
{
System.out.println("Mango");
}
}
假设在你的代码的某个地方,你做
Apple a;
Mango m;
如果您尝试使用此变量a
或m
访问 Class 成员,
a.printApple(); or m.printMango();
它会抛出 NPE
即你定义了类对象的引用变量,但实际上并没有创建它们
Apple a = new Apple();
Mango m = new Mango();
[在我刚接触 Java 时做了很多事情]
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