2011-09-30 53 views
2

我有一個非常簡單的方法:如何捕獲Java中缺少對象引起的異常?

public int getScore() { 
    return game.gameWindow.userBestScore; 
} 

的問題是,它可以碰巧game對象或gameWindow不存在。我不想得到空指針異常。如何以正確的方式抓住它?我可以這樣做:

public int getScore() { 
     try{ 
      return game.gameWindow.userBestScore; 
      } catch(NullPointerException e){ 
       return -1; 
      } 
    } 
+1

看看這個:http://stackoverflow.com/questions/271526/how-to-avoid-null-statements-in-java – 2011-09-30 13:35:58

+3

有沒有一個原因,你不只是測試'null'? –

+0

過量使用空值檢查可能會很快導致代碼庫的可讀性問題。這就是說,有時在某些情況下檢查空值是適當的。 – smp7d

回答

2

你可以這樣做。在嘗試訪問userBestScore之前,您還可以檢查遊戲和gameWindow是否爲空。

if(game != null && game.gameWindow != null) 
    return game.gameWindow.userBestScore 
1

你可以這樣做。或者您可以在取消引用這些對象之前檢查null,並在不引發異常的情況下采取適當的操作。這會更有效率。

您應該問的真正問題是:爲什麼地球上的某個對象對私有數據成員具有空引用?你沒有正確構建你的對象。一個對象應該被正確地初始化,並在創建之後100%準備好。否則,你最終不得不在代碼中進行不必要的防禦。

+0

位泛泛的概括。有很多理由說明爲什麼一個對象可能會有私人成員的空引用 – Steve

+0

您是否同意將不正確的初始化放在列表中?如果是,請列出其他一些,因爲我沒有看到「負載」。如果不仔細想想,我會想象不到半打。你的證據越詳細,證據越少。 – duffymo

+0

事實上,你已經從「爲什麼在地球上......」或許有十幾個理由證明了我的觀點。沒有意思得罪的方式,大部分都喜歡你的答案;) – Steve

12

不要抓NullPointerException

A NullPointerException是您的代碼不遵守某個合同的標誌。如果有可能game可以null,那麼你需要做一個明確的測試:

if(game != null) { 
    ... 
} 

else { 
    ... 
} 

如果game不能爲空,那麼你可以通過使用assert確保代碼的正確性。

assert game != null; 
... 

更令人擔心的是,game似乎是你的類的私有成員。在這種情況下,game可能不應該是null(雖然有些情況下此可以發生)。你在構造函數中正確初始化它嗎?我會說,你應該首先確保game正在被正確初始化。否則,您的代碼將最終被散佈在不必要的null-檢查中。例如,如果Game類中的gameWindow未正確初始化,該怎麼辦?你會需要另一個null -check爲:

if(game !== null && game.gameWindow != null) { 
    ... 
} 

else { 
    ... 
} 

所以,你應該首先確保你的對象的私有成員被正確初始化。如果是,並且事實證明game的有效使用情況爲null,那麼您需要明確的null-檢查。測試null總比測試NullPointerException好。除了不應該使用異常來控制業務邏輯流程的事實之外,如果在鏈的某個位置生成有效的NullPointerException(由於編程錯誤)會怎麼樣?現在你的catch會抓住它,你不會知道它;這可能會導致一些非常令人討厭和難以發現的錯誤。

2

檢查如下圖所示的變量是否null

public int getScore() { 
    if(game == null || game.gameWindow == null){ 
     return -1; 
    } 
    return game.gameWindow.userBestScore; 
} 
2
public int getScore() { 
    return ((game == null || game.gameWindow == null) ? -1 : game.gameWindow.userBestScore); 
} 
0

避免異常拋出儘可能多地。處理已知問題比拋出異常更好。

在某些地方,你必須做一個空檢查。可能在調用getScore()方法之前,因爲如果遊戲或gameWindow爲null,則無法調用該方法。

if (game != null && gameWindow != null) 
{ 
    int score = getScore(); 
} 

OR

public int getScore() 
{ 
    if (game != null && gameWindow != null) 
    { 
     return game.gameWindow.userBestScore; 
    } 
    else 
    { 
     return -1; 
    } 
} 

不要做重複的空checkings。