讨论:一个类的方法应该使用返回值来标识执行状态,还是抛出异常?
在一般的java三层架构中(WEB层<---->Service层<--->DAO层)中, Web 层的acion(如果使用Struts框架)通过调用Service的方法来处理用户提交的请求, 那么在action中既可以通过捕获Service层实现类的方法抛出的异常来转发不同的页面来给用户, 也通过使用if--else判断来判断Service层实现类的方法的返回值标识来转发不同的页面来给用户.
例如:
实现一: 接口的声明: public interface UserManager{ public boolean checkedUserExisted(User user); }
实现类: public class UserManagerImp{ public boolean checkedUserExisted(User user){ //伪代码 if(user存在){ return true; } else{ return false; }
} } 那么在 web层action中当调用checkedUserExisted()方法可以这样实现: if(umImp.checkedUserExisted()){ //转发用户已存在页面 } else{ //用户名合法 }
实现二: 接口的声明: public interface UserManager{ public void checkedUserExisted(User user) throws UserExisedException; }
实现类: public class UserManagerImp{ public void checkedUserExisted(User user) throws UserExisedException{ //伪代码 if(用户已存在){ throw new UserExisedException(); }
} }
那么在 web层action中当调用checkedUserExisted()方法时可以通过: try{ umImp,checkedUserExisted(); //用户名合法 } catch(UserExisedException ue){ //转发用户已存在页面 }
在这两种实现方式中,我偏爱第二种,在原来的论坛中也有帖子鼓励使用异常机制而不是使用if--else 甚至有的人说在面向对象的编程中不应该出现if--else,说使用异常机制更应该符合UML中的用例描述(正常事件流,异常事件流)
但是如果使用第二种异常机制的话,那么必须在Service中的每一个方法定义不同的异常对象, 这样action才可以通过捕获不同的异常来返回用户不同的页面. 但是这样会导致自定义异常类变多,如果业务复杂一点,那么自定义异常类会庞大到难以维护.
@`````总的说来第一种方法效率要高一些,但程序的流程上不太清晰,后者反之。 原因是抛出异常时要构造异常类,这就增加了系统开销,但在一般的系统里这些开销是极其微小的,所以一般建议用后者,但如果你的异常在代码执行过程中抛出的概率比较高的话建议用第一种方法。
BingJetMa说的很好,我再补充一下,在项目中最好定义一个能用的ApplicationException,自己写一个抽象类MyAction继承Action,在MyAction中处理ApplicationException,项目的所有Action都继承MyAction。
@`````我认为这是个"仁者见仁,智者见智"的问题,用返回值来标识比较简单、易懂,用异常来处理要写许多异常类复杂、难懂。不过我还是喜欢用简单、易懂的,我想java中的异常处理机制可不是给开发人员用来返回值标识和流程判断的。尤其在web开发中,大量的异常会给已经负担很重的server带来巨大压力,所以应该更多的用if else条件语句来避免可以预想到的异常的产生。在小型的c/s程序中可以考虑使用异常类来处理更多的流程控制。