我没有资格评论大师们的观点,但是我知道绝大多数的Java程序员根本就没有领悟“Exception”的真正用处。他们就是把Exception当做异常来理解,没有明白Exception实际上代表了一个UseCase中的异常流的处理。
在使用UseCase来描述一个场景的时候,有一个主事件流和n个异常流。异常流可能发生在主事件流的过程,而try语句里面实现的是主事件流,而catch里面实现的是异常流,在这里Exception不代表程序出现了异常或者错误,Exception只是面向对象化的业务逻辑控制方法。如果没有明白这一点,那么我认为并没有真正明白应该怎么使用Java来正确的编程。
而我自己写的程序,会自定义大量的Exception类,所有这些Exception类都不意味着程序出现了异常或者错误,只是代表非主事件流的发生的,用来进行那些分支流程的流程控制的。例如你往权限系统中增加一个用户,应该定义1个异常类,UserExistedException,抛出这个异常不代表你插入动作失败,只说明你碰到一个分支流程,留待后面的catch中来处理这个分支流程。传统的程序员会写一个if else来处理,而一个合格的OOP程序员应该有意识的使用try catch 方式来区分主事件流和n个分支流程的处理,通过try catch,而不是if else来从代码上把不同的事件流隔离开来进行分别的代码撰写。
总之 Exception <> 异常
BTW:我是支持BE和JG的观点的。我以前在接触C#的时候,就很奇怪C#的这一点了,Anders有他的理由,但是我认为一个良好的面向对象的软件是应该强制使用Exception的。
另外纠正一个错误的观点:很多人喜欢定义方法的返回类型为boolean型的,当方法正确执行,没有出错的时候返回true,而方法出现出现了问题,返回false。这在Java编程当中是大错而特错的!
方法的返回值只意味着当你的方法调用要返回业务逻辑的处理结果的。如果业务逻辑不带处理结果,那么就是void的,不要使用返回值boolean来代表方法是否正确执行。
例如 用户登陆方法
boolean login(String username, String password);
很多人喜欢用boolean返回,如果是true,就是login了,如果false就是没有登陆上。其实是错误的。还有的人定义返回值为int型的,例如如果正确返回就是0,如果用户找不到就是-1,如果密码不对,就是-2
int login(String username, String password);
然后在主程序里面写一个if else来判断不同的流程。
int logon = UserManager.login(xx,xx);
if (logon ==0) {
...
} else if (logon == 1) {
...
} else if (logon ==2) {
..}
这是面向过程的编程逻辑,不是面向对象的编程逻辑。
应该这样来写:
User login(String username, String password) throws UserNotFoundException, PasswordNotMatchException;
主程序这样来写:
try {
UserManager.login(xx,xx);
....
用户登陆以后的主事件流代码
} catch (UserNotFoundException e) {
...
用户名称没有的事件处理,例如产生一个提示用户注册的页面
} catch (PasswordNotMatchException e) {
....
密码不对的事件处理,例如forward到重新登陆的页面
}
分享到:
相关推荐
论文中,作者探讨了First-Come First-Serve(FCFS)、Low Suspicion First(LSF)和Round Robin三种不同的转发策略,并结合session异常度模型,利用真实网络日志进行了模拟分析,研究了合法请求返回时延随时间的变化...
UCSD_Anomaly_Dataset是一个专门用于异常检测研究的数据集,它为科研人员提供了丰富的实践素材。 该数据集以".tar.gz"格式提供,这是一种常见的文件压缩方式,由UNIX操作系统发展而来,广泛应用于Linux和macOS等...
1 月 29 日,做空研究机构香橼表示其将停止做空研究。1 月 29 日 Robinhood 宣布将取消交易限制,但 GameStop 股价自此一路下行,“喧嚣”逐步平息。 事件原因:宽裕流动性、社交媒体造势、拥挤交易逼空等因素导致...
流量监控可以帮助网络管理员了解网络的实时状态,及时发现网络异常,预测网络流量趋势,以及为网络扩容和优化提供依据。监控系统通常采用SNMP(简单网络管理协议)技术,它是当前网络设备和管理平台间通信的标准协议...
当进程试图访问不在物理内存中的页时,会发生缺页异常,这时操作系统会根据页面替换算法(如LRU,Least Recently Used)决定将哪个页换出到磁盘上的交换文件,然后将所需的页加载到内存中。 除了页表,Linux内存...
《ucore实验答案详解——清华大学操作系统ucore实验代码解析...ucore_os_lab-master压缩包中的源代码就是最好的学习资料,通过阅读和调试,可以深入理解ucore实验的每一个细节,为今后的系统编程和研究打下坚实的基础。
文章进一步讨论了扰动位的外边值问题,这一问题通过第三边值问题(Robin问题)得以描述。第三边值问题是一种典型的边值问题,它涉及在给定边界条件下求解偏微分方程。在这里,扰动位表示在大地水准面外部的重力位,...
它使用了简单的调度算法,如轮转调度(Round Robin),以在多个进程中公平地分配CPU时间片。进程间通信(IPC)通过共享内存或管道实现。 2. **内存管理**:XV6使用分页机制进行内存管理,将物理内存与虚拟内存映射...
6. **异常和中断处理**:在Pintos中,异常和中断的处理是操作系统内核的重要组成部分,它们用于处理硬件错误、系统调用和其他异步事件。 7. **系统调用**:Pintos提供了一系列的系统调用接口,如`sys_fork()`、`sys...
6. 异常和中断处理:内核需要处理硬件产生的中断和异常情况,这部分源码展示了如何响应并处理这些事件。 7. 编程接口:Linux内核提供了一组编程接口,允许用户空间程序与内核进行交互。学习这些接口的实现,有助于...
1. 进程调度算法:包括 First-Come-First-Served(FCFS)、Shortest Job First(SJF)、Priority Scheduling、Round Robin(RR)等。 2. 进程控制块(Process Control Block):一个数据结构,用于存储进程的状态和...
DNA重组可分为四种类型:同源性重组、位点特异性重组、异常重组和转座重组。其中,同源性重组是最常见的一种,它依赖于DNA序列的同源性,即两条DNA链的互补碱基配对,通过重组酶的作用完成序列交换。这一过程在减数...
在实际实现中,需要考虑各种边界条件和异常情况,例如处理优先级反转问题、饿死问题等。同时,为了模拟真实操作系统中的进程状态,还需要引入如阻塞、唤醒等状态转换。 通过理解这些调度算法的工作原理以及它们在...
8. **调度算法**:内核使用了简单的轮转调度算法(Round Robin)来分配CPU时间片给各个进程,保证了多个进程公平地共享处理器资源。 9. **错误处理**:内核中包含了各种错误检测和处理机制,如内存越界检查、系统...
9. **异常处理**:ACE_Exception和ACE_Transient_Exception处理错误和异常情况,保证程序的健壮性。 10. **移植性**:ACE库的跨平台特性使得代码可以在多种操作系统上运行,包括Unix、Linux、Windows等。 通过深入...
- 用户Robin Kay称:“这本书在我编写Java代码时节省了我数小时的研究时间。无论显而易见的问题还是复杂的难题,这本书都能给出答案。” - Net Rambler from Europe表示:“尽管我已经有了5.5年的Java经验,但这本书...
在这个名为"guessing-game:代码研究员201分配"的项目中,我们关注的是一个基于JavaScript的猜谜游戏。这个游戏的开发可能是一个编程课程或工作坊的一部分,由Robin Navigator(Sabrina)指导,并由Austin Sprague和...
优化这部分可能包括研究不同的调度算法,如轮转法(Round Robin)、优先级调度(Priority Scheduling)或实时调度策略,并评估它们的性能。 7. **实验-计操**:这个文件可能是实验指导书或报告模板,包含了具体的...
Dubbo 实现了多种负载均衡策略,例如轮询(Round Robin)、随机(Random)、最少活跃调用数(Least Active)、一致性 Hash(Consistent Hash)和自定义(Customize)。这些策略旨在优化服务消费者的请求分发,确保...