讨论:一个类的方法应该使用返回值来标识执行状态,还是抛出异常?
在一般的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程序中可以考虑使用异常类来处理更多的流程控制。
分享到:
相关推荐
方法名如果为一个单词则使用小写,如果由多个单词组成,第一个单词小写,之后的每个单词首字母大写。这样的命名风格称为驼峰命名法。 sort(),arraycopy(),binarySearch() countDigit(),isPointIn(), ...
vc中获取一个线程的状态及返回值,VS2012工程,通过点击界面上按钮,启动一个判断线程,然后再这个判断线程启动一个工作线程,在判断线程里判断工作线程的工作状态
数组作为方法返回值类型 学习目标 1 理解方法返回值类型是数组 引用类型的方法签名; 2 理解并学会数组作为方法返 回值类型的方法编写; 3 理解并熟知数组作为返回值 类型的方法调用。 方法的返回值类型 方法的...
方法如果没有返回值,用void作为返回值类型,否则要给出一个合适的返回值类型。 方法名要符合命名规范。 参数列表根据具体情况,可有可无。如果有多个,用逗号分隔,并且分别声明类型。 如果需要返回值,则方法体中...
执行外部exe获取返回值
本文章是关于有参数无返回值的函数。
主要介绍了android webview中使用Java调用JavaScript方法并获取返回值,本文直接给出代码示例,需要的朋友可以参考下
主要介绍了python使用threading获取线程函数返回值的实现方法,需要的朋友可以参考下
1.在shell脚本执行python脚本时,需要通过python脚本的返回值来判断后面程序要执行的命令 例:有两个py程序 hello.py 代码如下: def main(): print “Hello” if __name__==’__main__’: main() world.py def ...
面向对象程序设计,即C++语言,类。函数的返回值为类的类型,文件里面有详细的注释。
方法的返回值类型如何定义
支持多个返回值的工具类,比较好解决函数有多个返回值的情况
习惯了VS下面开发.NET,按下///+Tab键就能自动添加注释,...按照本文操作,最后只要按下:/**+Tab键,就可以实现跟VS一样的效果了~~~IDEA自动设置代码注释的方法(带参数,带返回值,如果没有则跳过参数或返回值方法)
包含 无参无返回值 ...//创建一个MethodDemo类的对象myMethodDemo //使用对象名。方法名()去调用方法 无参带返回值 //求长方形面积的方法 //返回语句 无参无返回值 //求最大的方法 等Java的方法和返回值的内容
在此我给出一个Demo,看看通过Runnable接口如何实现Callable接口的有返回值。这个例子并不摘自JDK中Callable接口源码,只是提供一种可行方案,仅供参考!该Demo解压、导入到开发环境即可,测试入口为test包下的...
弹出界面返回值,使用greybox弹出页面的返回值。
验证android sqlite数据库insert 和delete 方法返回值的具体规律 insert 插入一行,如果当前最大id是4,insert新的一条记录id是5 ,如果把5删除, 在insert一条新的记录id还是5,如果删除的是id为4的记录, 再新增一...
c函数调用-不使用函数返回值c函数调用-不使用函数返回值
的不是异常类,而是一个异常实例,而且每次只能抛出一个异常实例。throw语句的语法格式如下: –throw ExceptionInstance; •如果throw语句抛出的异常是Checked异常,则该throw语句要么处于try块里,显式捕获...
如果委托有返回值,直接执行委托,只会返回最后一个方法的返回值。 本实例演示如何获取委托链中所有的返回值。