讨论:一个类的方法应该使用返回值来标识执行状态,还是抛出异常?
在一般的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程序中可以考虑使用异常类来处理更多的流程控制。
分享到:
相关推荐
本示例“vc中获取一个线程的状态及返回值”主要关注如何在VS2012环境下创建和控制线程,以及如何获取线程的状态和返回值。以下将详细介绍相关知识点。 1. **线程基础**: - 在多线程编程中,线程是程序执行的最小...
方法名如果为一个单词则使用小写,如果由多个单词组成,第一个单词小写,之后的每个单词首字母大写。这样的命名风格称为驼峰命名法。 sort(),arraycopy(),binarySearch() countDigit(),isPointIn(), ...
6. **返回值解析**:子程序返回的值通常是一个整数,不同的数值代表不同的执行状态。例如,0通常表示成功,非零值表示错误代码。主程序需要根据这些返回值来判断子程序的执行情况。 7. **异步执行与同步执行**:主...
在给定的描述中,作者面临的问题是如何在一个环境搭建工具中,通过多线程并行执行操作,并收集每个操作的返回值来判断所有操作是否成功。为了解决这个问题,作者创建了一个名为`MyThread`的类,这个类封装了多线程...
在Android开发中,WebView组件提供了在应用内嵌入网页并运行JavaScript代码的能力。而在某些场景下,可能需要从...如果应用的targetSdkVersion高于17,建议使用evaluateJavascript()方法来替代,以增强安全性和性能。
数组作为方法返回值类型 学习目标 1 理解方法返回值类型是数组 引用类型的方法签名; 2 理解并学会数组作为方法返 回值类型的方法编写; 3 理解并熟知数组作为返回值 类型的方法调用。 方法的返回值类型 方法的...
这类方法不返回任何值,主要用于执行一个过程或改变对象的状态。在上述示例中,如果我们的目标只是打印两个数字,而不需要得到任何返回结果,那么可以定义一个void方法: ```java public void printNumbers(int num...
本文将重点讨论“有参数无返回值的函数”,这类函数在实际开发过程中非常常见,尤其是在执行特定任务但无需返回结果的情况下。 #### 二、基础知识 在C语言中,函数的基本结构如下: ```c return_type function_...
下面将详细讨论这些方法的使用及其重要性。 1. 无参无返回值的方法: 这类方法不接收任何参数,并且不会返回任何值。它们通常用于执行简单的任务,如打印输出或初始化。在描述中提到的`printlnStar()`方法就是一个...
方法如果没有返回值,用void作为返回值类型,否则要给出一个合适的返回值类型。 方法名要符合命名规范。 参数列表根据具体情况,可有可无。如果有多个,用逗号分隔,并且分别声明类型。 如果需要返回值,则方法体中...
总结来说,处理弹出界面返回值是UI设计中的重要一环,尤其是在使用greybox这类技术时。它涉及到事件处理、数据传递、错误处理等多个方面,需要开发者具备良好的JavaScript基础和用户体验意识。正确地处理返回值,...
4. **派生类C**:定义一个派生类`C`继承`B`,再次重写基类中的方法,使其抛出`MyException3`。 5. **向上转型**:在`main()`方法中创建一个`C`类型的对象,将其转换为`A`类型的引用,并调用该方法。 示例代码如下:...
函数的返回值为什么只能有一个?这个问题引发了我们对函数设计和语言支持的思考。在本文中,我们探讨了函数返回值的限制、多返回值的需求、语言支持的不足和可能的解决方案。 函数返回值的限制 在大多数编程语言中...
2. **使用返回值进行错误报告**:即使函数的主要目的是修改参数,也可以考虑返回一个状态码或错误指示符,以便调用者可以检查函数是否成功执行。 3. **保持一致性**:在项目中,应尽量遵循一致的编程风格,如函数...
函数返回值是指函数执行完毕后返回给调用者的一个结果。在C语言中,函数可以返回各种类型的值,包括整型、浮点型、字符型等。返回值允许函数向调用者提供计算结果或状态信息,是函数间数据通信的重要手段。 二、...
此外,对于那些不返回值的方法,我们可以使用其他断言方法来检查其对系统状态的影响。 总之,JUnit是一个强大且灵活的工具,它可以帮助开发人员有效地进行单元测试,从而提高代码的质量和可靠性。
对于习惯了Visual Studio(简称VS)开发环境中的.NET开发者来说,按下`///+Tab`键即可自动生成带有参数和返回值的代码注释,这大大提高了开发效率。然而,在使用IntelliJ IDEA进行Java开发时,这种便捷的功能似乎并...
在Web API开发中,接口的返回值类型是一个关键部分,因为它直接影响着客户端如何接收和解析服务端的数据。本文主要探讨了Web API中的四种主要返回值类型:void、IHttpActionResult、HttpResponseMessage以及自定义...
- 在处理用户交互时,你可能会定义一个处理按钮点击的函数,该函数可能改变视图状态或执行某些计算,但并不需要返回结果。 - 在数据处理中,一个无返回值的函数可能负责清理或验证数据,但它不会返回处理后的数据...
此外,可以使用枚举类型(enum)来表示各种状态,将返回值封装在一个对象中,包含成功/失败状态以及额外的错误信息。 在实际应用中,这些概念常常结合使用。例如,我们可以创建一个泛型工厂类,该类接受一个类的...