2011-12-08 121 views
11

對於我的Java應用程序,我創建了一個用戶信息對象的實例,並用一個我不控制源的服務來填充它。Java - 忽略異常並繼續

的代碼看起來是這樣的:

// username given as parameter 
UserInfo ui = new UserInfo(); 
try { 
    DirectoryUser du = LDAPService.findUser(username); 
    if (du!=null) { 
     ui.setUserInfo(du.getUserInfo()); 
    } 
} catch (Exception e) { 
    // Whatever 
} 

如果LDAPService.findUser()無法找到一個用戶,它會拋出一個NullPointerException和磨我的應用程序的其它部分停止。如果用戶信息沒有填充就沒關係,所以我希望能夠繼續而不會導致其他所有內容開始拋出異常。

有沒有辦法做到這一點?

+6

忽略異常是不好的做法! – mre

+5

你的代碼不是這樣嗎?只要//不管什麼都不做,執行將在try/catch塊之後正常繼續。 –

+0

有什麼問題?如果'findUser'拋出一個異常,它會被捕獲到你已經寫好的'catch'。它不會阻止任何事情? – Nanne

回答

18

我已經upvoted Amir Afghani's answer,這似乎是唯一的一個,但實際上回答這個問題。

但我會寫它像這個:

UserInfo ui = new UserInfo(); 

DirectoryUser du = null; 
try { 
    du = LDAPService.findUser(username); 
} catch (NullPointerException npe) { 
    // It's fine if findUser throws a NPE 
} 
if (du != null) { 
    ui.setUserInfo(du.getUserInfo()); 
} 

當然,這取決於你是否希望趕上從ui.setUserInfo()du.getUserInfo()電話的NPE。

+1

上記錄它,我會將其標記爲答案。它看起來像我所需要的是一個更嚴格的try/catch塊。 – SpeedBurner

+1

我已經表決了你的答案,因爲a)你是對的,b)你明確地打電話給我。 –

+0

我想補充一下,因爲我們不一定想要捕捉並忽略所有的Nu​​llPointerExceptions,可以進一步看一下NPE的細節(getCause,getMessage,getLocalizedMessage,getStackTrace),如果它不符合一個非常特定和狹窄的標準,重新扔掉它。但是,我剛剛注意到,我的評論大概是7年後的事實。 – mtwagner

0

你可以寫一試 - 圍繞要行catch塊忽略。

就像您的示例代碼一樣。如果你只是繼續你的代碼在catch塊的右括號之下,那麼很好。

3

您已經在您的代碼中執行此操作。在下面運行這個例子。捕獲將「處理」異常,並且您可以前進,假設您發現和處理的任何內容都沒有將代碼按照您預期的方式分解。

try{ 
     throw new Exception(); 
}catch (Exception ex){ 
    ex.printStackTrace(); 
} 
System.out.println("Made it!"); 

但是,您應該始終正確處理異常。你可以讓自己陷入一些相當凌亂的境地,並通過「忽略」例外來編寫代碼很困難。只有在實際處理異常出現問題時才應該這樣做,以至於它確實不會影響程序的其餘部分。

0

LDAPService中應包含LDAPService.isExists(String userName)方法使用它來防止NPE被拋出。如果不是 - 這可能是一個解決辦法,但使用日誌可以張貼一些警告..

+0

主要問題是我無法編輯LDAPService類。 – SpeedBurner

+0

如果我有一種方法可以知道用戶不在LDAP中,那麼可以忽略它,但順便說一下,您應該在INFO/DEBBU層 –

2

它通常被認爲是一個壞主意,忽略例外。通常,如果合適,您希望通知用戶該問題(如果他們願意的話),或者至少要記錄該異常,或將堆棧跟蹤打印到控制檯。

但是,如果這是真的沒有必要的(你是一個做決定)則沒有,有沒有其他辦法忽略,迫使你抓住它的異常。唯一的修改,在這種情況下,我會建議明確列出該類你忽略例外的,併爲一些評論爲什麼你忽略他們,而不是簡單地忽略任何例外,你已經完成了你的例子。

18

你可以趕上NullPointerException明確而忽略它 - 雖然它一般不推薦。您應該而不是,但是,請忽略所有異常,因爲您目前正在執行此操作。

UserInfo ui = new UserInfo(); 
try { 
    DirectoryUser du = LDAPService.findUser(username); 
    if (du!=null) { 
     ui.setUserInfo(du.getUserInfo()); 
    } 
} catch (NullPointerException npe) { 
    // Lulz @ your NPE 
    Logger.log("No user info for " +username+ ", will find some way to cope"); 
} 
1

你實際上忽略了代碼中的異常。但我建議你重新考慮。

這裏是Coding Crimes: Ignoring Exceptions

一開始報價,異常應至少是被記錄下來,不只是 寫出到控制檯。而且,在大多數情況下,應將異常 扔回給調用者處理。如果 不需要返回給調用者,則應該處理異常 。有些評論也會很好。

這種類型的代碼通常的藉口是「我沒有時間」,但 當代碼處於這種狀態時會產生連鎖反應。機會是 ,這種類型的代碼絕大多數將永遠不會在最終的 生產。代碼評論或靜態分析工具應該捕獲這個 錯誤模式。但這不是理由,所有這些都會增加軟件的維護和調試時間。

即使您忽略它,我建議您使用特定的異常名稱而不是超類名稱。即在catch條款中使用NullPointerException而不是Exception

0

打印堆棧跟蹤,記錄或發送消息給用戶,是處理異常的非常糟糕的方法。任何人都可以通過適當的步驟描述解決方案來修復異常,然後再次嘗試破碎的指令嗎?