2013-10-23 73 views
0

我想寫越來越少的代碼,我試圖找到一種方法來防止崩潰。Java如何防止空對象異常

一個例子,我曾經遇到過什麼:

public class MyClass 
{ 
    private User user; 

    public MyClass() 
    { 
     // Get user from another class 
     // Another thread, user can be null for couple of seconds or minutes 
     // Asynchronous call 
     user = AnotherClass.getUser(); 

     // start method 
     go(); 
    } 

    private void go() 
    { 
     // Method 1 
     // Program it is crashing if user is null 
     if (user.getId() == 155) 
     { 
     // TO DO 
     } 
     else 
     { 
     System.out.println("User is NOT 155 !"); 
     } 

     // Method 2 
     // Program still crashes if user is null 
     if (user != null && user.getId() == 155) 
     { 
     // To do 
     } 
     else 
     { 
     System.out.println("user is not 155"); 
     } 

     // Method 3 
     // Program wont crash, but I write much more code ! 
     if (user != null) 
     { 
     if (user.getId() == 155) 
     { 
      // To do 
     } 
     else 
     { 
      System.out.println("User is not 155 !"); 
     } 
     } 
     else 
     { 
      System.out.println("User is not 155 !"); 
     } 
    } 
} 

正如你所看到的,方法3它的工作,但我寫太多的代碼......我該怎麼辦?

+1

方法2也應該工作。重新檢查它。在java中如果第一部分是假的第二部分沒有評估。 – Leonidos

+0

重點不在於它不起作用,而在於它相對冗長 –

回答

1

爲什麼不在這裏使用null object pattern,所以不是將用戶設置爲空,而是將其設置爲User對象的特殊「空」情況(實現)?

例如

user = AnotherClass.getUser(); 
if (user == null) { 
    user = new NullUser(); 
} 

(理想AnotherClass.getUser()會做內部空校驗)

在這種情況下

user.getId() 

可以返回一個特殊值(-1?),它絕不會等同於一個有效的用戶標識。因此,您的代碼將永遠看起來像:

if (user.getId() == 155) 

這同樣適用於User對象上的其他方法。

+0

如果我編輯User類並添加一個默認值爲-1的字段ID,該怎麼辦? private int id = -1;公共用戶(/ * params * /){} –

+0

也許這也適合 –

1

它一定是被這句話開始的塊裏面的東西:

if (user != null && user.getId() == 155)

這在邏輯上是相同的方法3.當JVM看到的是user爲null,則應該停止該評估。

我會說,雖然我在JVM 1.3中遇到過類似的情況,所以如果您使用的是真正舊的JVM,可能就是這樣。

2

喜歡的方式Short-circuit evaluation,即方法2

AND函數的第一個參數的計算結果爲,總體值必​​須爲;

 if (user != null && user.getId() == 155) 
     { 
     // To do 
     } 
     else 
     { 
     System.out.println("user is not 155"); 
     } 

這是最優選的和可讀的代碼。

你的設想是錯誤的,method2崩潰和method3的作品。在上面的代碼中,如果user != null那麼只有user.getId() == 155執行。

+0

如果我交換這兩個條件呢? if(user.getId()== 155 && user!= null)? –

+0

@ZbarceaChristian你最終會得到Null指針異常。如果交換這些條件,那麼它就像'if(user.getId()== 155) {if(user!= null){}',這是沒有意義的。 –