Java程序开发规范_第1页
Java程序开发规范_第2页
Java程序开发规范_第3页
Java程序开发规范_第4页
Java程序开发规范_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Java程序开发规范文档修订记录版本状态说明日期变更人批准日期批准人*状态:C创建,A增加,M修改,D删除目录第1章 简介11.1 目的11.2 范围1第2章 JavaDoc规范12.1 语法知识22.2 注释举例22.3 JavaDoc的写法32.4 注释范围42.5 Java源文件注释的组成42.6 注意事项62.7 Tag的用法72.7.1 Tag列表7 常用Tag的用法72.8 包的JavaDoc8 包注释的写法8 包注释的内容92.9 Eclipse对JavaDoc的支持92.9.1 Eclipse中注释设置9 使用Eclipse生成JavaDoc102.9.3 Eclipse Pl

2、ugin10第3章 代码规范113.1 命名规范11 类的命名11 接口的命名12 方法的命名12 变量的命名14 包的命名143.2 代码布局143.2.1 Java源文件总体组成14 缩进15 空格15 空白行15 折行153.2.6 Eclipse中的代码布局153.3 代码尺寸163.4 修饰符使用163.5 异常的使用16 异常定义16 异常分类17 异常设计17 异常处理173.6 比较、判断与运算18 比较18 判断19 运算203.7 初始化20 变量的初始化20 静态block的初始化20 类的初始化213.8 类设计213.9 字符集的使用233.10 代码规范性验证24第

3、4章 参考资料24第1章 简介1.1 目的本文档的核心目标包括:1. 提高代码的正确性、可读性;2. 提高团队作业的一致性和规范性;3. 保证产品开发、项目实施的质量;4. 提高代码、文档的重用性、可维护性、可扩展性。1.2 范围本文档涉及的规范对象包括:1. JavaDoc,包括注释的范围,语法等的书写规范;2. Java源代码,包括类、接口、变量的命名,实例的初始化,源代码的布局等的规范。第2章 JavaDoc规范JavaDoc是什么 JavaDoc是开发者对其Java程序模块的规格说明书,是程序开发者与使用者之间的契约。通俗的讲,JavaDoc就是Java程序的使用手册,只不过这个手册具

4、备了一个特殊的优点:它是由Java源代码中注释生成的,它始终和源代码保存在一起,代码与注释的更新同步很容易做到。学习建议 想要详细了解JavaDoc请顺序阅读本章节,并请同时参考Java官方站点关于JavaDoc的写法(URL见参考资料部分)和Java文档生成参考手册官方文档的URL:. 另外建议,常常阅读并模仿JDK和Spring源代码中注释的书写。快速参与 如需快速生成JavaDoc请参考2.9章节。注意:你真的知道JavaDoc怎么写了么?2.1 语法知识整个JavaDoc由Class(Interface)和Package JavaDoc两部分组成,Package的JavaDoc参考2.

5、9章节,Class(Interface)的 JavaDoc由注释块组成。注释块定义如下:/* * Description * * Tags */其中Description是对被注释主体的描述,描述的内容包括:主体的功能,组成,使用条件,参数范围,注意事项,用法示例等1。Tags是对被注释主体的输入、输出、异常等要素的定义,如param,return,throws等,对实例变量的注释可以没有Tag。2.2 注释举例方法的注释举例如下:/* * Determine if the given type is assignable from the given value, * assuming se

6、tting by reflection. Considers primitive wrapper classes * as assignable to the corresponding primitive types. * <p>For example used in a bean factory's constructor resolution. * param type the target type * param value the value that should be assigned to the type * return <true> if

7、 the type is assignable from the value, otherwise return <false>. */public static boolean isAssignable(Class type, Object value) 类的注释举例如下2:/* * Static convenience methods for JavaBeans: for instantiating beans, * checking bean property types, copying bean properties, etc. * * <p>Mainly f

8、or use within the framework, but to some degree also * useful for application classes. * * author Rod Johnson * author Juergen Hoeller * author Rob Harrop */public abstract class BeanUtils 接口的注释举例如下:/* * Interface to be implemented by objects that can resolve messages. * This enables parameterizatio

9、n and internationalization of messages. * * <p>Spring provides two out-of-the-box implementations for production: * <ul> * <li><b>ResourceBundleMessageSource</b>, built on standard * <li><b>ReloadableResourceBundleMessageSource</b>, being able to reloa

10、d message * definitions without restarting the VM * </ul> * * author Rod Johnson * author Juergen Hoeller * see * see */public interface MessageSource 类变量注释举例如下:/* System time when the event happened */private final long timestamp;2.3 JavaDoc的写法1. 一行注释限于80个字符内,注释可以英文也可以是中文,但同一个包中注释语言要求一致,注释内容要

11、求表达正确、清楚、简单明了。2. 注释的第一句,英文称为Topic sentence,即题干句,应开门见山的交代被注释对象的功能。第一句不应超过80个字符,以英文句式的period结尾(.,即句号)。题干句将被JavaDoc Tool抽取到总结性描述表中(Summary Table )。3. 注释中的标点符号必须是在英文输入状态下录入的,所有标点符号后必须空一格。4. 注释内部需引用其它注释时请使用link URL标签,URL可以是类接口,或这两者的方法,也可以是public的域(field),在注释单元已经有import引入时,只需写类名接口名,否则请加包名全称限定(package name

12、)。5. 注释块内部段落的分隔,使用<p>标签。6. 对于Java语法关键字、包名、类名、方法名、接口名、域名、参数名几类关键字请使用<code></code>标签。7. 对于代码示例和用法的注释,请使用<pre></pre>标签。8. 在注释中需空格两个以上时,请使用转义字符&nbsp;,其它常用转义字符包括:&lt;(相当于<),&gt;(相当于>)。9. HTML中的标签可以用在JavaDoc的书写中,包括上面提到的一部分,还有如加粗标签<b></b>,换行标签<

13、br>,无序列表<ul></ul>等等,更多HTML的Tag请参考。2.4 注释范围1. 所有的类、接口、域、方法(包括private修饰的部分)都必须注释,代码块(block)及语句(statement)注释可选,关键逻辑部分必须书写注释。2. 针对注释继承,即使接口、父类中已注释了,在子类中override或implements时请务必对具体的实现作个性化注释,切勿copy-paste。如果确认此处实现无需使用者关心时,则可以不用写具体实现的注释,只需加上/* inheritDoc */。2.5 Java源文件注释的组成Java源文件(类或接口定义文件)中注释

14、的组成包括:版权声明,类(接口)注释,方法注释,代码块注释,单行语句注释,变量注释(实例变量和方法变量)。参考如下例子3:/* * (#)CertProviderImpl.java1.0 Nov 11, 2007 * * Copyright (c) 2008 139 * Use is subject to license terms. */package vider;import java.util.Map;import mons.logging.Log;import mons.logging.LogFactory;import com.139.bank.cer

15、t.CertHelper;/* * 证书服务者容器的实现, 提供证书服务者注册与获取的功能. 各家银行的证书服务者注册通过 * link vider.CertProviderImpl#setProvider(Map),内部实现以 * <code>java.util.Map</code>作为各家银行证书服务者的注册表,提供以关键字<code>bankId</code>通过 * link vider.CertProviderImpl#getProvider(String)取得相应银行的证

16、书服务者. * * author Richard Chen * version 1.0 * since 1.0 */public class CertProviderImpl implements CertProvider /* 日志实例. */protected Log log = LogFactory.getLog(this.getClass();/* 证书服务者的存储单元, 包含所有运行时的证书服务提供者. */protected Map provider = null;/* * 缺省构造方法, 空实现. */public CertProviderImpl() /* * 根据指定的银行代

17、号获取其证书服务者实例, 通过证书服务者可获取签名, 验签等服务. * * param bankId 银行代号. * return 对应银行的证书服务者实例. * throws IllegalArgumentException 如果指定银行的证书服务者不存在的话. */public CertHelper getProvider(String bankId) /* * 考虑根据交易号transactionId模糊查询获取对应的 * 证书服务者. */if (provider.containsKey(bankId) CertHelper certHelper = (CertHelper) prov

18、ider.get(bankId);return certHelper; else / 如果没找到, 则指定银行的证书服务者未注册.throw new IllegalArgumentException("No such bankId");/* * 注册各家银行的证书服务者. * * param provider * 各家银行的证书服务者注册表, key为银行代号, value为对应银行的证书服务者. */public void setProvider(Map provider) vider = provider;其中蓝颜色部分为版权声明注释,红颜色为类注释,青

19、色为实例变量注释,紫色为方法注释,深黄色为代码块注释,绿色为单行语句注释。2.6 注意事项1. 注释描述使用第三人称。2. 方法的描述使用动宾句式,方法的命名也应尽量采用动宾句式。3. 禁止注释仅重复被注释对象的名称,如: /* * Sets the tool tip text. * * param text the text of the tool tip */public void setToolTipText(String text);应丰富注释的内容,参考如下: /* * Registers the text to display in a tool tip. The text * d

20、isplays when the cursor lingers over the component. * * param text the string to display. If the text is null, * the tool tip is turned off for this component. */ public void setToolTipText(String text);2.7 Tag的用法2.7.1 Tag列表JavaDoc中可以使用的Tag包括(jdk1.4, 各Tag如同时出现,则排列顺序同下):Tag名称Tag作用备注param参数描述仅供类, 接口,

21、方法注释时使用。同一个注释块可同时出现多个param描述。return返回描述仅供方法注释时使用。除void方法外其它所有方法必须有一个return描述。throws异常描述零到多个。exception同上同上author开发者描述类和接口注释中必须有。可有零到多个。version版本描述类和接口注释中必须有。只有一个。see参考描述可有零到多个。since起始描述只有一个。serial序列化描述或serialField或serialData,可有多个。deprecated废除标志只有一个。2.7.2 常用Tag的用法1. param 后面跟参数名, 再后面跟参数描述,参数是属输入要素,是此功

22、能模块对调用者的约束,描述中应包括条件、范围、来源等, 以句号结束(官方网站作了区分,这里我们要求句号结尾)。如:param millionSeconds 访问日期, 以毫秒计.2. return 除定义为void的方法无需此标签外,其它所有方法必须有此标签,返回属此功能模块的输出,返回描述中必须详细描述返回值列的范围、返回值的状态等,尤其要说明在什么条件下返回null(如果此功能模块有可能会返回null的话)。如:return 受控者当前访问的累计次数.3. throws 方法中如果可能抛出异常,则必须注释说明在什么条件下将抛出什么异常,checked和unchecked异常必须都作说明(注

23、意在方法声明中不要包含unchecked异常的声明)。/* * 报文发送, 负责具体通讯相关事宜的处理. * * param obj * 报文体. * throws CommunicationException * 连接超时或指定主机不存在. * throws TransformException * 请求报文或应答报文格式错误. * return 应答报文. */Object submit(Object obj) throws CommunicationException, TransformException;2.8 包的JavaDoc2.8.1 包注释的写法在Java源文件的包中增加一个

24、文件,替换文件中之间的内容为每个具体包的注释。JavaDoc工具将自动根据此文件生成package-summary.html文件。注意不要手动将此文件拷贝进生成的JavaDoc文件中!2.8.2 包注释的内容包注释的内容包括:1. 包的主体功能及包内部各关键单元之间的关系描述;2. 包所实现的规范的完整描述,对于不含在JavaDoc内但属于规范一部分的资源请给定连接;3. 使用包需要掌握的预备知识、准备知识或相关知识的说明。2.9 Eclipse对JavaDoc的支持2.9.1 Eclipse中注释设置型别注释(Class, Interface)和版权声明模板定制如下:Windowà

25、PreferencesàJavaàCode StyleàCode TemplatesàComments:Types:/* * $todo. * author$user * version1.0 * since1.0 */WindowàPreferencesàJavaàCode StyleàCode TemplatesàCode:New Java files:/* * (#)$file_name1.0 $date * * Copyright (c) 2008 139 * PROPRIETARY/CONFID

26、ENTIAL. Use is subject to license terms. */ $package_declaration$typecomment$type_declaration2.9.2 使用Eclipse生成JavaDoc选中需生成JavaDoc的项目,如spring-framework->菜单栏,projectàGenerate Javadocà按提示操作,如下图示:JavaDoc的生成可以通过命令行执行javadoc命令生成,也可以通过Eclipse等IDE提供的功能生成,但我们强烈建议JavaDoc的生成由项目组的配置管理人员通过CI工具生成(CI,

27、Continuous Integration)。2.9.3 Eclipse Plugin此外,关于JavaDoc的自动生成有个非常好用的Eclipse插件JAutodoc(Under Eclipse Public License - v 1.0)。它可以自动生成Java源文件内生成JavaDoc所需的所有注释,包括型别注释,方法注释,实例变量注释。JAutodoc的下载地址: 下载后在Eclipse中安装完成(关于Eclipse Plugin的安装请Google求解),打开一个Java源文件,Ctrl+Alt+J看看发生什么了(有时需切换到英文输入状态下,或Ctrl+Alt+J两次,可能是个小

28、Bug)!JAutodoc插件的设置:WindowàPreferencesàJavaàJAutodoc:去除Add ToDo for auto-generated Javadoc选项,选中Add file header选项并进行编辑:Add file header的设置:/* * (#)$file_name1.0 $date * * Copyright (c) 2008 139 * PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.*/第3章 代码规范3.1 命名规范3.1.1 类的命名首先,类名应

29、由一到多个英文单词或单词简写组成,每个单词的首字母大写,简写的单词必须是大家熟知、认可的,如Id代表Identify,Tel代表Telephone等,请勿随意使用简写单词命名。命名要求符合正则表达式4:A-Za-zA-Z0-9*$。其次,类名要能反映其核心功能语义,争取做到知其名识其意。下表中为应用程序中常用到的类命名修饰语:命名修饰前缀/后缀功能描述备注Action后缀业务逻辑处理单元的标志应用程序中所有业务逻辑处理单元必须以Action为命名结尾,如转账的业务逻辑处理单元命名:TransferActionQueryAction后缀查询类业务逻辑处理单元DetailAction后缀单条记录明

30、细单元PreAction后缀业务逻辑预处理单元如果一个业务逻辑处理需要前后两个或三个单元实现时,将第一个单元定义为XxxxPreAction,第二个单元定义为XxxxAction,第三个单元定义为XxxxResActionResAction后缀业务逻辑处理结果单元同上UploadXxxFileActionN/A上传Xxx文件单元完整的业务单元名称DownloadXxxFileActionN/A下载Xxx文件单元同上Factory后缀工厂类多由框架提供,应用程序慎用Impl后缀针对接口或抽象类的缺省实现Abstract前缀抽象类尤其是定义了算法模板,但算法实现在子类中实现的情形Tag后缀自定义标

31、签的实现Resolver后缀行为或结果解析器Exception后缀自定义异常Test前缀测试单元实现Utils后缀工具类不可实例化Constants后缀常量类不可实例化,不含方法,所有变量以public static final修饰Formatter后缀报文格式化应用组件(本系统à外系统)Parser后缀报文解析单元应用组件(外系统à本系统)3.1.2 接口的命名接口的命名应符合正则表达式:A-Za-zA-Z0-9*$,建议只使用大小写字母而不要使用数字。注意:请勿使用I或Interface作为接口命名的前缀。3.1.3 方法的命名方法的命名应符合正则表达式:a-za-zA

32、-Z0-9*$。方法在OO思想里代表着行为,所以方法命名应采用英文动词或动宾词组,如run, getName等。方法参数列的命名应尽量同类实例变量保持一致(或同方法体内的变量保持命名相似性),在赋值时给实例变量加上this.限定,如:public void setName(String name) = name;或:public void register(String serviceKey, Object serviceValue) String key = serviceKey;Object value = serviceValue;.对于类内存在委托关系的方法的命名(

33、就是一个方法的实际逻辑处理委托给类内另外一个方法的情况),首先如果委托方与被委托方参数列相同,则被委托方应声明成private或protected,被委托方的方法命名应参考委托方的命名,在委托方的命名基础上增加前缀修饰就可以了(诸如:do,internal等修饰语),如:public boolean validate(String name) if (name = null | name.trim().length() = 0) return false; else return doValidate(name);private boolean doValidate(String name)

34、if (name.equals(“Rich”) return true;return false;其次,如果委托方与被委托方参数列不相同,则被委托方的方法命名可以和委托方的方法命名相同,也即方法的Overload。如:public User createUser() User user = new User(“anonymous”, 0);return user;public User createUser (String userName) User user = createUser();user.setName(userName);return user;public User crea

35、teUser (String userName, int userAge) User user = createUser(userName);user.setAge(userAge);return user;另外,Java技术界对常见和常用设计模式中的方法命名已有某种程度上的共识,如Factory模式中获取实例的方法命名为getInstance,Command模式中的方法命名为execute等等,请遵从这些共识的命名习惯。对于JavaBeans中的属性方法命名请遵从JavaBeans技术规范。例如简单属性的写方法要求命名成setXXX;值为boolean型的属性读方法要求命名成isXXX,其它

36、属性一律命名成getXXX,其中XXX为Bean的简单属性。3.1.4 变量的命名常量的命名以public static final起始修饰,命名应符合:A-ZA-Z0-9*(_A-Z0-9+)*$。实例变量、方法体和代码块内部定义的变量的命名应符合:a-za-zA-Z0-9*$。变量的命名要求尽量采用名词,除循环体内的临时变量的命名可以为单个字母,其它变量都应采用完整的单词、单词组合或单词简写的方式命名,增强变量的可读性。3.1.5 包的命名包的命名应符合正则表达式:a-z+(.a-za-z0-9*)*$。尽管JPL(The Java Language Specification)中没有规定

37、大写字母不能用于包的命名中,但是业界对于包的命名基本都是采用小写的,请同样遵从。对于业务逻辑实现而言,包命名参考:com.139.domain.typename.module。其中domain为业务领域名称,如网上银行的domain可命名为ebank,电话银行的domain可命名为callcenter等,domain也可以取项目的名称;typename为领域或项目的类别,主要考虑到同一个项目可能会包括多个应用,则此时可以用typename来作限定,例如typename取为per代表个人模块,ent代表企业模块,client代表面向终端用户,mgmt代表面向管理员(管理端,控制台等);modul

38、e为功能模块名,如报表模块的module可命名为report,预约模块的module可命名为booking等。这样个人电话银行预约模块的包名应该类似:com.139.callcenter.per.booking,所有预约模块的实现都应定义在这个包下。如果项目没有typename限定的话则包命名取:com.139.domain.module。如果客户方要求以其实体名作为包名限定,则可以采用:panyname.domain.typename.module,其中companyname类似于icbc(工行)、boc(中行)等。如客户未作强调则一律限定为139。对第三方开发包或开发框架进行

39、扩展而定义的包,命名请参考:anizevariable,其中organize为第三方包开发者或组织名称,variable为被扩展的包的后半部的名称,如要对包进行扩展,则扩展包应定义为:com.139.ext.spring.beans.support,再如对java.util包进行扩展则应命名为:com.139,注意java为保留字。3.2 代码布局3.2.1 Java源文件总体组成1. 文件头的版权声明,定制请参考2.9章节;2. import语句,源文件中需引用本包外定义的类型时须依靠import语句引入(或直接在引用对象前加包名限定)。包内的引用和java.l

40、ang包无需import即可使用,引用语句的顺序依次为java,javax,org,com,避免使用通配符引入。在EclipseIDE环境中,可以通过WindowàPreferencesàJava Code StyleàOrganize Imports定制源文件中import语句的引入顺序,通过Ctrl+Shift+O组合按键批量引入import语句并同时执行顺序排版,去除冗余引入;3. 类或接口注释;4. 类或接口的定义名(signature);5. 类或接口的定义体(body)。3.2.2 缩进在Java源文件中,缩进分为三个层次:类和接口的定义体缩进、方法体

41、缩进、代码块缩进(block,含block递归),缩进单位为4个空格(Space)。类和接口的版权声明、import语句、signature无需缩进,但定义体需缩进4个空格;方法体在定义体缩进4个空格的基础上再次缩进4个空格;对于方法体内代码块内部的语句还将缩进4个空格,如果代码块嵌套则将继续缩进4个空格。缩进的代码块包括try-catch语句、循环语句(for、do-while、while-do)、switch语句等。3.2.3 空格1. 首先,逗号后必须空一格;2. 所有运算符(含组合运算符+=、-=等,.、+、-除外)、赋值符前后必须空一格;3. 所有关键字与其它关键字、非关键字之间必须

42、空一格,与圆括号()之间有时例外,如this(),super()等。4. 所有花括号前后必须空一格,或者折行;5. 对于圆括号,开口圆括号前必须有一个空格,方法名或前面也是开口圆括号的情况除外。开口圆括号之后与闭口圆括号之前无空格。闭口圆括号之后必须有一个空格,之后如果是另外一个闭口圆括号或语句结束符号;则除外。3.2.4 空白行1. package与import语句之间空一行;2. import组之间空一行;3. import语句与型别声明(类、接口的定义)之间空一行;4. 实例变量定义与方法定义之间空一行;5. 方法与方法之间空一行;6. 型别与型别声明之间空一行;7. 在文件结尾后空一行

43、。3.2.5 折行1. 首先一对花括号之间必须折行,数组值列表未超过行规定长度的情况除外;2. 如果超过行规定的最大长度则折行;3. 如果表达式折行,则在操作数之后在运算符之前折行;4. 声明方法时参数列折行,在逗号之后,折行后参数列起始与上行参数列平齐;5. 方法调用时参数列折行,在逗号之后,折行后参数列缩进4格,多次折行时,每行都缩进4个空格。3.2.6 Eclipse中的代码布局布局设置 Eclipse主窗体WindowàPreferencesàJavaàCode StyleàFormatterà选择Eclipsebuilt-in

44、4;Edit,可以新建一套布局设置,建议保留默认设置不要更改。布局格式化 在源代码编辑的主窗体中选中整个Java源文件内容(Ctrl+A),同时按下Ctrl+Shift+F就可以对整个源代码内容含JavaDoc进行布局格式化了,Eclipse自动调整源代码和JavaDoc的缩进、空格、空白行、折行等!注意:切换到英文输入法状态下。所有的代码请务必进行布局格式化!3.3 代码尺寸过长的代码通常都意味着其需要重构,下面给出代码语句行数的参考意见(注意是语句,不含注释等):1. 类的大小通常情况下不要超过120行,最好控制在70行以下;2. 方法体的大小通常情况下不要超过70行,最好控制在30行以下

45、;3. 每行的字符不要超过80个字符,最好控制在70个字符以下;4. 方法参数列不要超过5个,最好控制在3个以下。3.4 修饰符使用可见性 包括四类:public, protected, private, 没有明确指定的时候为package。可见性本着最小化的原则,能不可见就不可见,能定义为private的绝不定义为protected,当要定义为public时请仔细考虑是否必要。修饰符的出现请严格遵从如下的顺序:1. public 2. protected 3. private 4. abstract 5. static 6. final 7. transient 8. volatile 9.

46、 synchronized 10. native 11. strictfp3.5 异常的使用3.5.1 异常定义异常的抛出表明:1. 请求者输入的数据或请求不合理,违背了被请求者与请求者之间的契约,即Specification Violation。如对数组进行越界访问就是请求者数组下标数据范围违约;再如对已生成Iterator实例的HashMap对象进行结构性修改(通过其put或remove等方法),则Iterator实例将会抛出ConcurrentModificationException,表明此时对HashMap对象进行结构性修改的请求不合理。2. 被请求者处理单元中需要的外部资源不可用,

47、如需要打开的文件不存在等。3.5.2 异常分类 异常按其性质可以分为两类:Checked Exception和Unchecked Exception。1. 如果处理单元即被请求者认为请求者尚能进行Violation修正则抛出Checked Exception。2. 如果被请求者认为无论请求者(或者自己)如何修正与补救都将无济于事,则抛出Unchecked Exception。3.5.3 异常设计。注意:通常情况下我们不需要自定义异常。如果开发框架已提供异常处理体系则我们只需按开发框架的开发指南针对合适的情形选用合适的异常就可以了。3.5.4 异常处理首先,业务逻辑处理模块中应谨慎抛出异常,能不

48、抛出异常的情况下请尽量不要抛出异常。有异常抛出必有异常处理,这将增加了请求者的处理负担,另外异常还将影响程序运行的性能,影响先进编译器对Java代码的优化。其次,业务逻辑处理模块中常见的使用异常的场景就是业务逻辑处理模块内部构造一个异常或包装一个已捕获的异常后抛出。业务逻辑处理模块中应只抛出开发框架规定的异常,即开发框架异常体系中合适的checked或unchecked异常。对于第三方开发包抛出的异常,业务逻辑处理模块应根据具体情况如确需rethrow通知外部,则应将第三包的异常包装成开发框架异常体系中合适的异常后再抛出,同时必须将原异常作为开发框架中异常的构造参数之一(Throwable c

49、ause参数)。业务逻辑处理模块在构造抛出的异常时,必须提供String message参数,此参数的值限定为英文。开发框架应对此message作解析后形成合适的提示语返回给用户。根据Throwable cause参数和String message参数的需求,应用开发框架设计的异常必须至少提供一个两参数的构造方法,如public NestedRuntimeException(String message, Throwable cause)。在进行异常捕获时,catch语句应首先匹配子类异常再匹配父类异常。不能为了偷懒,只catch Throwable,catch Throwable语句说明tr

50、y语句中发生什么错误catch语句的使用者也不清楚(Specification规定一定不能抛出异常的情况例外)。通常情况下,业务逻辑处理模块自己抛出的异常自己无需再作处理;对于第三方的异常,根据需要作处理后再包装抛出。异常抛出前请务必使用log将异常信息及解释列印出来,同样的,在catch住异常时首先应使用log列印出异常信息。方法体如需抛出checked异常则必须在方法的signature中声明(增加throws定义),方法体中抛出的unchecked异常无需声明。但是,所有方法可能抛出的异常请务必在JavaDoc中作详细说明。异常处理示例:/* * 根据用户上下文对象中用户的客户号, 查询

51、此客户号关联的收款人详细信息. * * param context 用户上下文对象, 内含当前用户的客户号信息. * exception UtoException 收款人详细信息不存在. */public void execute(Context context) throws UtoException Map paraPayeeDetail = context.getDataMap();User user = context.getUser();paraPayeeDetail.put(Dict.CIFNO, user.getCifNo();Map payeeDetailMap = (Map)

52、 this.getSqlMap().queryForObject("service.queryPayeeDetailMap", paraPayeeDetail);/ No record, throw exception!if (payeeDetailMap.size() = 0) log.debug("Query Payee Detail Error");throw new ValidationException("validation.service.QueryPayeeDetailFail");context.setDataMap

53、(payeeDetailMap);3.6 比较、判断与运算3.6.1 比较在Java中,要求参与比较运算的操作数operator1与operator2必须是同一个型别或者是型别兼容的。我们建议参与比较的两个操作数必须是同一个型别的,例如char型的b和c可以作大小比较if(b > c),char型的b也可以和int型的100作大小比较if(b > 100),这是因为char型b将会先作向上转型(Upcasting)为int型后再和100作比较,但是后者比较就没有前者清晰直观。非同一型别之间的比较应避免出现。如果参与比较运算的操作数都是primitive变量(或常量),即byte、s

54、hort、int、long、float、double、char七个型别,boolean除外,那么operator1与operator2可以直接使用比较运算符(<, <=, >, >=, =, !=)对两者进行比较;如果操作数operator1与operator2属于对象型变量(或常量),则有两种方式可以对两者进行比较:一是两者都实现接口,通过Comparable#compareTo方法进行比较;另一中方式是单独实现,委托Comparator#compare方法对operator1与operator2进行比较。建议采用前一种方式实现Comparable接口进行比较,具体实现请参考Java 2 Platform Standard Edition 5.0 API Specification。应用程序中如果需要覆写的equals方法, 请确保对象比较的四个特性:自反性、对称性、传递性和一致性的正确性并请同时覆写hashCode方法5。如果表达式a = b为真且a、b为primitive变量,则a与b值相等;如果a、b为引用,则a与b为同一个实例的引用。常见操作的比较:1. 字节流InputStream和字符流Reader的各种实现中read

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论