2011-04-01 80 views
4

在我目前正在寫的程序快速/優雅的方式,我覺得自己做了以下很多...的Java:檢查null

Map<String,List<String>> network = loadSerializedObj(file); // null if failed 
if(network != null) { 
    anonNet = util.anonymize(newNet); 
} else { 
    // Some sort of error handling. 
    System.out.println("Some sort of error message. Exiting..."); 
    System.exit(0);   
} 

有沒有處理的事件更簡潔的方式從文件加載序列化對象不起作用,該方法返回null?任何提示都歡迎。任何地方我都可以讓這更優雅?

+0

除了檢查是否'network'爲null,則它在其他地方使用?如果沒有,你可以說'if(loadSerializedObj(file)!= null)',它會稍微壓縮你的代碼。 – mre 2011-04-01 02:21:11

回答

6

你應該使loadSerializedObj拋出異常而不是返回null。當你沒有任何東西要返回時你可以返回null。當某些事情中斷時,你應該拋出異常。

+0

我通常也這樣做。 – mre 2011-04-01 01:58:39

0

你可以做一個名爲n(對象)的函數的靜態導入,如果返回null,則返回布爾值。或者使用Groovy :)

2

在這種情況下,您可以使用異常捕獲。

Map<String,List<String>> network = loadSerializedObj(file); // null if failed 
try { 
    anonNet = util.anonymize(newNet); 
} catch(NullPointerException npe) { 
    System.out.println("Some sort of error message. Exiting..."); 
    System.exit(0);   
} 

但您必須指定util.anonymize纔會拋出NullPointerException,如果它還沒有。

+0

-1 ouch!爲什麼你會爲程序的正常流程使用異常? – iluxa 2011-04-01 01:33:18

+1

來對待異常! – 2011-04-01 01:34:59

+1

這不是一個正常的流程!這是一個例外:「某種錯誤消息。退出...」這是一個錯誤的情況! – 2011-04-01 01:38:40

1

你可以有某種

class MyAssert { 
    static<T> assertNotNull(T object) { 
    if (object == null) { 
     System.out.println("something is wrong..."); 
     System.exit(0); 
    } 
    return object; 
    } 
} 
0

我覺得你有什麼,因爲它得到,同時保持容易閱讀/維護的代碼爲好。

0

番石榴的preconditions可以是一個很好的方式來進行簡潔的可讀性檢查。

Preconditions.checkNotNull(myReference, "My error message"); 
1

嘗試返回一個empty map,而不是一個空值:

if(!loadSerializedObj(file).isEmpty()) 
    { 
     anonNet = util.anonymize(newNet); 
    } 
    else 
    { 
     // error handling  
    } 

    private Map<String,List<String>> loadSerializedObj(File file) 
    { 
     // do stuff 
     if(mapObject == null) 
     { 
      mapObject = Collections.emptyMap(); 
     } 
     return mapObject 
    }