飞云小侠 2005-7-23 http://www.jscud.com 转载请注明作者
【处理好你的异常】
-----------------
异常处理是Java编程中非常重要的一个部分.建议在使用异常之前阅读<Effective Java Programming Language Guide>或者<Practical Java>.
下面从书中摘出几条建议:
*绝对不要忽略异常
*千万不要隐藏异常***
*仅在不正常的情况下使用异常
*对可恢复的情况使用可检查异常,对程序错误使用运行时异常(RunTimeException)
*给方法引发的异常做文档
*在详细信息里面包括失败捕获信息
*使用finally避免资源泄漏
*....
在这里特别提出的是,在开发中要特别处理NULL的情况,否则经常引发NullPointException异常,在Java里这是一个最令人头疼的异常了.
如果你的程序因为一个NULL值,而报了几十个NullPointException的话,不但得让人烦死,而且还非常难以找到错误所在.所以在Java中一定要注意这个问题.
如果你的函数不允许Null值,那么可以截获它,抛出一个异常,或者给客户更友好的提示,难道不好吗?
让我们来看一个例子:
public String getName(User aUser) { //如果aUser为Null,会发生什么情况 return aUser.getName(); }
|
很明显,如果参数为Null,就会抛出异常.应该改为:
public String getName(User aUser) { if(null=aUser) { return ""; } else { return aUser.getName(); } }
|
或者你要求参数不能为空,还可以抛出一个异常,强制使用者不能传入空值.
还有经常被忽略的是RunTimeException和普通异常的区别,在Java中,这是一个特殊的异常类,程序中如果遇到这个异常,用户可以不截获它,而如果是其他的普通异常,就不许要截获它.我们的代码经常这么写:
try { //your code here } catch(Exception e) { //do warn }
|
这样写的话,就截获了所有异常,当然也包括了RunTimeException. 在很多情况下,这是不合适的处理方式,我们只应截获必要的异常,而应该忽略RuntimeException.
关于RunTimeException,在Spring中还有更好的利用方式,建议阅读Spring框架中在事务中对异常的处理代码,例如对Jdbc抛出的SqlException的转换.
关于异常处理,我提出几点建议:
*捕获异常而且再次抛出时要包含原来的异常信息
*不要忘了RunTimeException,除非必要,否则不要用catch(Exception e)的方式捕获所有异常.
*不要用异常做流程控制,异常的性能代价比较高昂.(对此,可能有人不同意.此处不详细讨论)
*不要把异常处理都抛给别人,本函数有能力处理的就不要抛出.
在此建议读者详细阅读<Effective Java Programming Language Guide>或者<Practical Java>.
【过度依赖】
在定位错误的时候,经常遇到浏览了七 八个文件还是没有找到什么地方执行了真正需要的函数,这个时候就非常郁闷.A调用了B,B调用了C,C调用了D......让人找不到北
面对这样的程序,存在的问题不仅仅是定位错误麻烦,而且如果需要维护这样的函数库/框架,恐怕你的有非常高的统御能力才行,否则打死我也不去维护.
那么我们自己最好不要写这样的程序出来给人用.
【滥用接口】
现在流行"面对接口编程",这本身本来是不错,但是滥用接口的现象却经常发生.
"面向接口",于是所有的类都有一个对应的接口,接口的函数声明和类一模一样,而且一个接口只有一个类来实现它.这样的面向接口有什么意义哪? (为了用Spring的事务的情况除外)
根据"迪比特法则(Law of Demter)",一个对象应当对其他对象有尽可能少的了解.一个接口内应该只定义对方所需要的方法,而不要把一些没用的方法声明放在接口里面.
例如如下一个类:
public class MyCounter { private int n1; private int n2; public MyCounter(int n1,int n2) { this.n1=n1; this.n2=n2; }
public void setN1(int n1) { return this.n1 = n1; } public void setN2(int n2) { return this.n2 = n2; } public int getN1() { return n1; } public int getN2() { return n2; }
public int getResult() { return n1 + n2; } }
|
我们可以看到,这个类的主要目的是得到计算结果,所以正确的接口应该类似:
public interface Counter { int getResult(); }
|
但是很多情况下,经常是这样的接口:
public interface Counter { int getResult(); int getN1(); int getN2(); void setN1(int n1); void setN2(int n2); }
|
我们想一想,这样做有2个后果:
1.除了getResult之外,其他的函数我们根本用不到,所以是多余的.
2.如果我们要自己实现一个Counter,如果接口中仅仅定义了getResult,我们仅仅需要实现它就可以了.我们自己的类可能是多个数运算,有乘除加减等等各种运算,参数也有可能是一些数组.但是如果按照第二种方法声明接口的话,我们就必须实现后面的四个方法,如果这样的话,实现这样东西不仅没用,而且浪费时间.我们恐怕要大声骂娘了吧.
所以,接口有好的作用,但是不要滥用.
■ 如果你的接口永远只有一个类实现,那么可能就没有必要用接口.
■ 你的接口只需要声明别人用到的函数即可.
分享到:
相关推荐
### 库路径迷踪:在 CMake 中解决找不到库的终极指南 CMake 作为一款强大的跨平台构建工具,被广泛应用于各种类型的软件项目中,无论是开源还是商业项目。其核心优势在于高度的可定制性以及对不同平台的良好支持。...
综合来看,这个JavaWeb登录注册页面项目涵盖了Web开发中的多个关键点,包括用户认证、安全防护、数据库操作和项目管理,是学习和实践JavaWeb开发的一个良好实例。通过深入理解并实现这些功能,开发者可以提升自己的...
它利用了Web开发的主流技术和设计模式,为用户提供了便捷、高效的服务。同时,系统的可扩展性和灵活性也为其在实际应用中适应更多场景提供了可能。对于学习JavaWeb开发的人员来说,这样的项目既是对技术栈的实践,也...
4. 柠檬素材部屋.txt 和 迷踪魅影.txt:这些文本文件可能是关于皮肤设计过程的说明,或者是设计师对"魅影迷踪"风格的灵感来源和创作思路的记录。 5. ad:这个文件名可能是广告相关的,可能包含广告代码或者关于如何...
AICANS 2.0攻克安防机器人迷踪失明症.pdf 本资源文件主要介绍了机器人和智能安防系统的相关知识点。以下是从标题、描述、标签和部分内容中生成的相关知识点: 1. 机器人技术在安防行业的应用:随着机器人技术的...
《迷踪失路》是一款基于Unity引擎开发的第一人称恐怖迷宫游戏,它融合了惊悚元素和解谜挑战,为玩家带来独特的游戏体验。在这款游戏中,玩家将扮演主角,置身于一个阴森恐怖的迷宫之中,寻找出路的同时,还要面对...
-鼠标单击即可射击 -按住单击即可为光束充电,直到充电条充满电,松开即可射击 -WASD 键移动 -收集地图上分布的 3 颗宝石 -收集完 3 颗宝石后,进入位于地图中心的大门 -你需要玩得开心。 SJA 分析数据: ...
**MVC三层架构详解** 在软件开发中,MVC(Model-View-Controller)模式是一种广泛应用的架构设计,尤其在Web应用中。该模式将应用逻辑分为了三个主要部分...理解和实践这样的案例对于提升Java Web开发能力非常有帮助。
系统设计报告可能会详细涵盖需求分析、系统架构设计、数据库设计、界面设计、功能模块实现以及性能优化等多个方面。数据库文件可能包含了图书信息表、用户信息表等,用于存储系统运行所需的数据。 通过这个项目,...
JavaBean是Java开发中的一个组件模型,可以看作是封装了特定业务逻辑的对象,它们在JSP中被用作可重用的代码段,简化了开发过程。 【JavaBean】在这里可能被用来实现成绩计算、查询等功能。例如,一个JavaBean可能...
SSM整合是Java Web开发中常见的一种技术栈组合,由Spring、SpringMVC和MyBatis三个框架共同构成。这个组合在企业级应用中广泛使用,因为它提供了灵活的依赖注入、强大的MVC功能以及轻量级的数据访问能力。下面将详细...
通过卫星图片测算图片驻点步骤1:在定时时角和赤纬处,添加(0,0)处星星的时角和赤纬,可以用stellarium 步骤2:而在定义平面坐标处添加星星坐标,这里坐标可以用geogebra来测量,不过我是按照鬼蝉的计算方法来写的...
【人教版小学二年级语文(下册)生字表】是针对中国小学生设计的一份教学材料,旨在帮助学生在二年级下学期学习并掌握基本的汉字书写和认读。这个生字表分为两个部分:生字表(一)和生字表(二),涵盖了多个主题,...
SpringBoot是一个由Pivotal团队开发的Java框架,它简化了初始化和配置过程,使得开发者可以更快地构建独立的、生产级别的基于Spring的应用。在瑞吉外卖项目中,SpringBoot可能被用来管理依赖、提供内嵌式Web服务器...
在生物学分类系统中,微生物的分类是按照一个严格的阶元体系进行的,这个体系包括了界(Domain)、门(Phylum)、纲(Class)、目(Order)、科(Family)、属(Genus)和种(Species)。这个阶元体系是生物学家为了...
【C/C++、easyX】一款迷宫类记忆力游戏——《暗夜迷踪》-附件资源
1. JDK(Java Development Kit):Java开发工具包,是编写、运行Java程序必不可少的工具。在Linux中,我们需要下载对应版本的JDK,并通过`sudo apt-get install`或`yum install`命令进行安装,然后设置环境变量,...
PNG图标和3D ICON是两种常见的图形资源,广泛应用于软件开发、网页设计、移动应用界面以及各种视觉传达项目。在本资源包中,包含了2100张128x128像素大小的PNG图标和38张3D效果的ICON,为设计师和开发者提供了丰富的...
在标签中提到了"迷踪风暴",这可能是指一种特定的文本挖掘工具或技术,用于追踪和分析文本中的热点话题或趋势。然而,没有更详细的信息,我们只能推测它可能是一个用于实时监控和分析大规模文本流的系统。 "SMS3.1 ...