首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Exception >

什么时候返回null什么时候返回异常?

2014-01-26 
什么时候返回null什么时候返回异常?今天写程序,用了一个简单工厂模式,工厂类有一个静态工厂方法,传入一个参

什么时候返回null什么时候返回异常?

今天写程序,用了一个简单工厂模式,工厂类有一个静态工厂方法,传入一个参数,根据参数生成不同的对象:


代码

Java code
public static GateWayCaller getGateWayCaller(String serviceKey) {  if("alerting".equals(serviceKey))  {   return new AlertingCaller();  }  else if("report".equals(serviceKey))  {   return new ReportCaller();  }  //...  else  {   return null;  } } 



一同事硬说我return null不对,应该抛出一个checked异常,由客户端调用者去处理该异常。

我的想法很简单,既然这是一个生成对象的方法,如果调用者将参数传错导致要生成的对象不存在,就应该返回一个空对象,而不是抛出异常。不然的话所有客户端代码都要处理一个没用的异常!!

搞的好郁闷,最受不了的是老说我什么什么观点是错误的。俺也没有什么太多的编程经验,也不知道该怎么去反驳。我认为没有哪个观点是绝对错误的,只有比较之下哪种做法更好一点?听听大家的意见?


------解决方法--------------------------------------------------------
支持你。
这个时候不应该抛出异常。
------解决方法--------------------------------------------------------
你的同事说的只能说是一种解决方法,但并不是说你现在这个就不对。至于抛不抛异常,完全应该有应用的需要来决定。如果按你的写法,你的javadoc里应该注明,在什么情况下,此方法返回null值,这是个好习惯。

题外话:如果是sting值映射到一个实例的情况,建议用个map来做,不要用if,一是代码难看,二是维护成本增加。如果你的那几个Caller都是单例的,那map里直接放个实例就行;如果不能是单例的,那就放个Class对象,然后用调用其newInstance()方法;如果需要特殊的构造,可以写个接口来专门做构造。
------解决方法--------------------------------------------------------
你同事的观点是对的,应该抛出异常。

你返回null的话,看似简单,其实会让别人很头痛。这是因为:

1. 他一直要到用到这个返回对象的时候才知道他得到的是一个null(通过运行时的NullPointerException得知)。
2. 他只知道他得到了一个null,却不知道实际原因是什么,实际上的原因是他传入了不被接受的参数,但返回null并没有告诉他这一点。

所以,建议你的代码写成这样:

Java code
 if("alerting".equals(serviceKey))   return new AlertingCaller();  else if("report".equals(serviceKey))  return new ReportCaller(); //...  else   throw new RuntimeException("Invalid Service Key!");

        

热点排行