2015-04-08 82 views
2

我在檢查List對象是否爲null或者不使用java。但我不確定這是否是優化的方式。檢查java中的列表對象是否爲null

這裏是我的代碼:

List<String> listSCBPLNewErrMsgs= new ArrayList<String>(Arrays.asList(SCBPL_NEW_ERRORMESSAGES.split("\\$\\@"))); 

以上線路本身拋出空指針異常。

if(listSCBPLNewErrMsgs != null) <Right way?> 

這將獲得配置中的所有值。

現在,明天,如果我更改配置項,這不應該拋出一個空指針異常

+5

'listSCBPLNewErrMsgs'不會爲空,因爲您剛剛實例化它。它可能有0個元素。 –

+0

而*對象*不能爲空。對象引用,比如'listSCBPLNewErrMsgs'中的對象引用可以是'null',但不能是對象。但正如Ori所說,上面的那個肯定不會。 –

+2

你確定'SCBPL_NEW_ERRORMESSAGES'是非空嗎? –

回答

1

如果SCBPL_NEW_ERRORMESSAGES是空的代碼仍然會失敗。

假設SCBPL_NEW_ERRORMESSAGES具有某個值或爲空,則拆分將返回大小爲0或更大的數組。將其更改爲數組中的列表將產生具有0個或更多元素的數組。

最後,複製構造函數將複製內容並將其分配給新列表。在所有情況下,除非SCBPL_NEW_ERRORMESSAGES上有空指針,否則返回的列表(listSCBPLNewErrMsgs)永遠不會爲空,最多爲空,可以使用isEmpty()方法調用進行檢查。

根據您的意見,如果您在該行上獲得null指針,應該由於SCBPL_NEW_ERRORMESSAGES爲空的事實。

試試這個:

List<String> listSCBPLNewErrMsgs = null; 
if(SCBPL_NEW_ERRORMESSAGES != null) { 
    listSCBPLNewErrMsgs= new ArrayList<String>(Arrays.asList(SCBPL_NEW_ERRORMESSAGES.split("\\$\\@"))); 
} 
else { 
    listSCBPLNewErrMsgs = new ArrayList<>(); 
} 
+0

正確npinti ..列表 listSCBPLNewErrMsgs =新ArrayList (Arrays.asList(SCBPL_NEW_ERRORMESSAGES.split(「\\ $ \\ @」)));這行本身是空的 – Syed

+0

@Nizam:我已經更新了我的答案。您正在執行該行的3個操作,其中兩個將從不*返回空值,最多返回一個空集合。但是,如果嘗試拆分空字符串,將會得到NullPointerException。 – npinti

+0

謝謝npinti :) – Syed

1

如果您要檢查它是否爲null這是正確的方式(即使它永遠不會爲空),但是如果你只是想檢查,如果列表爲空,那麼你應該使用isEmpty()方法:

if(listSCBPLNewErrMsgs.isEmpty()) {/**/} 
+0

我已經更新了這個問題,你可以請檢查..實例化本身拋出空指針異常 – Syed

+0

我想你忘了一元布爾運算符'!' –

1

從外觀上來看,如果你的代碼的listSCBPLNewErrMsgs對象將不能爲空。測試是否爲空使用listSCBPLNewErrMsgs.isEmpty();

+0

我已經更新了這個問題,你能否請檢查一下。實例化本身是拋出空指針異常 – Syed

+0

然後檢查SCBPL_NEW_ERRORMESSAGES對象是否爲空 – DSF

0

您需要爲SCBPL_NEW_ERRORMESSAGES添加空檢查。

if (SCBPL_NEW_ERRORMESSAGES != null && !SCBPL_NEW_ERRORMESSAGES.isEmpty()) { 

在你的宣言,作爲您正在做new ArrayList<String>列表不能爲空。 所以不需要擔心空指針異常。


如果你想檢查空的列表。 然後你可以嘗試isEmpty()方法。

if (SCBPL_NEW_ERRORMESSAGES != null && !SCBPL_NEW_ERRORMESSAGES.isEmpty()) { 
    List<String> listSCBPLNewErrMsgs = new ArrayList<String>(Arrays.asList(SCBPL_NEW_ERRORMESSAGES.split("\\$\\@"))); 
    if (!listSCBPLNewErrMsgs.isEmpty()) { 
     // Do something. 
    } 
} 
1

如果SCBPL_NEW_ERRORMESSAGES是nulll將確實拋出NPE異常,因爲您將使用split方法上null

你可以先檢查,如果這不是空:

if (SCBPL_NEW_ERRORMESSAGES != null) { 
     //Instantiate list 
     //Optional isEmpty check 
} 

您首先會檢查SCBPL_NEW_ERRORMESSAGES不爲空

然後你就可以實例化你的列表,並執行新的列表上的可選isEmpty檢查。

+0

我已經更新了這個問題,你能否檢查一下。實例化本身是拋出空指針例外 – Syed

+0

更新了我的回答 –

3

new運營商在Java可以從未回報nullString#split也不能。

你可能要檢查,但問題在於,該列表不爲空:

if (listSCBPLNewErrMsgs.isEmpty()) { 
    // do something 
} 
+0

謝謝Mureinik。我已經更新了這個問題,你可以請檢查..實例化本身拋出空指針異常 – Syed

+1

@Nizam你確認'SCBPL_NEW_ERRORMESSAGES'不是空嗎? – Mureinik

0
if(SCBPL_NEW_ERRORMESSAGES != null) 
    List<String> listSCBPLNewErrMsgs= new ArrayList<String>Arrays.asList(SCBPL_NEW_ERRORMESSAGES.split("\\$\\@"))); 

爲大家listSCBPLNewErrMsgs != null沒有需要說

0

首先,你必須檢查SCBPL_NEW_ERRORMESSAGES爲空或空

if(!TextUtils.isEmpty(SCBPL_NEW_ERRORMESSAGES)) 

你必須同時檢查列表是否爲空/空。所以我更喜歡

if(listSCBPLNewErrMsgs != null && !listSCBPLNewErrMsgs.isEmpty()) { 
}