2011-04-01 55 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 
    }