[改善Java代码]异常只为异常服务
异常原本是正常逻辑的补充,但是有时候会被当做主逻辑使用.看如下代码:
public class Client {
enum Color {
Red, Blue;
}
public static void main(String[] args) {
System.out.println(Contain(Color.class, "Red"));//true
System.out.println(Contain(Color.class, "Yellow"));//false
}
// 判断一个枚举是否包含String枚举项
public static <T extends Enum<T>> boolean Contain(Class<T> c, String name) {
boolean result = false;
try {
Enum.valueOf(c, name);
result = true;
} catch (RuntimeException e) {
// 只要是抛出异常,则认为是不包含
}
return result;
}
}
判断一个枚举是否包含指定的枚举项,这里会根据valueOf方法是否抛出异常来进行判断,如果抛出异常(一般是IllegalArgumentException异常),则认为是不包含,若不抛出异常则可以认为包含该枚举项,看上去这段代码很正常,但是其中却有三个错误:
1.异常判断降低了系统性能.
2.降低了代码的可读性,只有详细了解valueOf方法的人才能读懂这样的代码,因为valueOf抛出是一个非受检异常.
3.隐藏了运行期可能产生的错误,catch异常,但没有做任何的处理.
上面的代码是用一段异常实现了一个正常的业务逻辑,这导致代码产生了坏味道,我们要在主逻辑中不使用异常.
代码如下:
public class Client {
enum Color {
Red, Blue;
}
public static void main(String[] args) {
System.out.println(Contain(Color.class, "不存在的枚举项"));
System.out.println(Contain(Color.class, "Blue"));
}
// 判断一个枚举是否包含String枚举项
public static <T extends Enum<T>> boolean Contain(Class<T> c, String name) {
//遍历枚举项
for(T t:c.getEnumConstants()){
//枚举项名称是否相等
if(t.name().equals(name)){
return true;
}
}
return false;
}
}
异常只能用在非正常的情况下,不能成为正常情况的主逻辑,也就是异常只是主场景中的辅助场景,不能喧宾夺主.
而且异常虽然是描述例外事件的,但能避免尽量避免,例如:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException; public class Client {
public static void main(String[] args) {
File file = new File("文件.txt");
try {
FileInputStream fis = new FileInputStream(file);
/* 其他业务逻辑处理 */
} catch (FileNotFoundException e) {
// 异常处理
}
}
}
这样一段代码经常在项目中出现,但经常写并不代表不能优化,这里的异常类FileNotFoundException完全可以在它诞生之前就消除掉:先判断文件是否存在,然后再生成FileInputStream对象.
代码如下:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException; public class Client {
public static void main(String[] args) {
File file = new File("文件.txt");
//经常出现的异常情况,可以先做判断
if (file.exists() && !file.isDirectory()) {
try {
FileInputStream fis = new FileInputStream(file);
/* 其他业务逻辑处理 */
} catch (FileNotFoundException e) {
// 异常处理
}
}
}
}
虽然增加了If判断,增加了代码量,诞生却会减少FileNotFoundException异常出现的几率,提高了程序的性能和稳定性.
[改善Java代码]异常只为异常服务的更多相关文章
- [改善Java代码]不要只替换一个类
建议20: 不要只替换一个类 我们经常在系统中定义一个常量接口(或常量类),以囊括系统中所涉及的常量,从而简化代码,方便开发,在很多的开源项目中已采用了类似的方法,比如在Struts2中,org.ap ...
- [改善Java代码] 提倡异常的封装
JavaAPI提供的异常都是比较低级别的,低级别是指只有开发人员才能看懂的异常.而对于终端用户来说基本上就是天书,与业务无关,是纯计算机语言的描述. 异常封装的三方面的好处: 1)提高系统的友好性 ...
- Java代码开发之《异常日志》
异常日志 (一) 异常处理 1. [强制]Java 类库中定义的可以通过预检查方式规避的 RuntimeException 异常不应该通 过 catch 的方式来处理,比如:NullPointerEx ...
- [改善Java代码]优先选择线程池
在Java1.5之前,实现多线程编程比较麻烦,需要自己启动线程,并关注同步资源,防止线程死锁等问题,在1.5版本之后引入了并行计算框架,大大简化了多线程开发. 我们知道线程有5个状态:新建状态(New ...
- [改善Java代码]equals应该考虑null值的情景
建议46: equals应该考虑null值情景 继续上一建议的问题,我们解决了覆写equals的自反性问题,是不是就很完美了呢?再把main方法重构一下: public class Client { ...
- [改善Java代码]易变业务使用脚本语言编写
建议16: 易变业务使用脚本语言编写 Java世界一直在遭受着异种语言的入侵,比如PHP.Ruby.Groovy.JavaScript等,这些“入侵者”都有一个共同特征:全是同一类语言—脚本语言,它们 ...
- [改善Java代码]不要在finally块中处理返回值
在finally代码块中处理返回值,这是在面试题中经常出现的题目.但是在项目中绝对不能再finally代码块中出现return语句,这是因为这种处理方式非常容易产生"误解",会严重 ...
- [改善Java代码] 避免instanceof非预期结果
建议18: 避免instanceof非预期结果 instanceof是一个简单的二元操作符,它是用来判断一个对象是否是一个类实例的,其操作类似于>=.==,非常简单,我们来看段程序,代码如下: ...
- [改善Java代码]小心switch带来的空值异常
使用枚举定义常量时,会伴有大量的switch语句判断,目的是伪类每个枚举项解释其行为,例如: public class Client { public static void main(String[ ...
随机推荐
- work_6
这次的作业是阅读C++11的新特性并提出问题,作为一个大部分代码都是用C++的基本语法并没有特别关注C++一代又一代新特性的学生来说,首先我阅读了一些关于新特性的文章.为了更快的理解,我首先选择了阅读 ...
- JVM基础知识(1)-JVM内存区域与内存溢出
JVM基础知识(1)-JVM内存区域与内存溢出 0. 目录 什么是JVM 运行时数据区域 HotSpot虚拟机对象探秘 OutOfMemoryError异常 1. 什么是JVM 1.1. 什么是JVM ...
- CentOS_6.5 64位系统,安装git服务器+客户端
================ git服务器安装 ==================== CentOS安装Git服务器 Centos 6.4 + Git 1.8.2.2 + gitosis## . ...
- 简谈HTML5与APP技术应用
HTML5到底能给企业带来些什么? HTML5是近年来互联网行业的热门词汇,火的很.微软IE产品总经理发文: 未来的网络属于HTML5.乔布斯生前也在公开信<Flash之我见>中预言:像H ...
- 在Java中super和this的区别
摘要:在Java中我们会时常用到super及this的用法,现在我主要来区分一下super.和this.及superL()及this()之间的区别,来对它们的认识和了解: 1.this的用法在Java ...
- delphi 插入表格HTML代码
<table width="174" height="76" border="1" align="center" ...
- ural 1993 This cheeseburger you don't need
顺次存到{} [] () 遇到逗号就处理下,最后处理逗号之后的 #include <iostream> #include <cstring> #include <stri ...
- Github上最全的APICloud开源前端框架效果盘点(转)
1.微信网站几分钟变身“原生 App” 微信推出了微信JS-SDK,使微信公共号可以直接调用微信原生的接口,具备部分原生应用的能力.微信JS-SDK的推出,将大大提高微信公共号的 用户体验,但是如果存 ...
- android UI进阶之实现listview中checkbox的多选与记录
今天继续和大家分享涉及到listview的内容.在很多时候,我们会用到listview和checkbox配合来提供给用户一些选择操作.比如在一个 清单页面,我们需要记录用户勾选了哪些条目.这个的实现并 ...
- 解决PowerDesigner 反向工程没有注释(备注)
本文转载自:http://www.cnblogs.com/zhangxb/archive/2012/04/20/2458898.html 1. 列注释 原来代码: {OWNER, TABLE, S, ...