2012-06-09 61 views
0

我有以下內的一段代碼for循環爲什麼拋出一個空指針異常?

MyClass myobj= new MyClass(customers, price); 
System.out.println(myobj); 
if (!myobj.equals(null)) { //same happesn with myobj != null 
    System.out.println("not null"); 
} 
myMethod(myobj); 

myMethod的主體是:

private void myMethod(MyClass myobj) { 
    if (myobj.totalDemand()) { 
     //bla bla 
    } 

運行代碼中的Junit行 「如果(myobj.totalDemand())」 拋出後一個NullPointerException,但控制檯打印「不爲空」

+3

「MyClass.totalDemand」的定義?或者把真正的堆棧跟蹤。 – Alexander

+2

100%NPE在totalDemand內 –

回答

3

如果您致電myobj.equals(null),不能保證該類的equals()的執行不會拋出NullPointerException,並且如果myobjnull,您將得到一個NullPointerException嘗試調用.equals()上的null對象。


爲了測試null,使用此代碼:

if (myobj == null) 

和測試不爲空,使用此:

if (myobj != null) 
+1

正如我在問題中指出的那樣,(myobj!= null) –

+0

正如亞歷山大問道:你能提供MyClass.totalDemand的代碼嗎?看起來你的NPE是從這個方法中拋棄的。 – Dzik

+0

實際上,爲null對象拋出NPE的equals方法違反了等價約定 - equals必須爲null對象返回false。實際上並不是真正的問題,因爲通常你在equals中的第一行是'o instanceof FooClass','instanceof'返回null(真的很有用) – Voo

0

如果MyObj中爲空,你會得到NullPointerException異常,如果它不是控制檯會打印出「不爲空」。 那麼,每個調用週期中變量客戶和價格是否有變化?