java 优化基础

java编码规范及优化

编程技术 2010-08-19 18:17:48 阅读65 评论0  字号: 订阅

Java 开发规范即编码规范(coding standard

@Version 1.0

@author  leaderpacemaker

 

第一章   概述

 

为了更好的规范开发流程,提高编码的质量。特制定本开发编码规范。

适用于java语言开发的项目程序编码内容。

第一节   遵循原则

代码的可维护性强;

代码的可读性强;

代码执行效率要高;

第二节   定义

 

第三节   参考资料

 

第二章   代码外观

第一节   风格

1、头注释,

/************************************

类名、描述

*@see

*@author (创建人)

*@date (创建日期)

*@version (版本)

*

*@since(所支持的jdk版本)

*

*代码检查人:

*修改日期:

*/

注:@see 引用其他类 允许引用其他类的文档;

@version 版本说明;

@author 姓名也可以是邮件地址;

2、类名的首字母要大写;

3、代码行长度

         代码行长度一般来应该在80个字符以内,通常情况下比较合理的在70个字符内。

4、折行

         当完整的一行代码难以在同一个代码行中时,采用折行。折行原则如下:

         1)在逗号后折行;

         2)在运算符前折行;

         3)高层折行优于低层折行;

         4)折下的代码行应该与其同等级的代码行左对齐;

         方法调用折行样例:

         oneMethod(myExpression1,myExpression2,myExpression3,

                            myExpression4,myExpression5);              //…………

运算符前折行与高层折行优于低层折行样例:

myEname1=myName2 * (myName3 + myName4 – myName5)

                                     + 4 * myName6;                //………..

5、访问实例与类中变量

              通常情况下,不要将类中的变量声明为公共类型 ( public )

              通过 get / set 方法访问变量;

在代码中引用类的静态方法或静态成员变量时,不准通过该类的实例对象引用,应通过类引用。样例:

     /***

     *@see  …….

     *@author  ……

     *@date ….

     */

     package  com.fence

     import com.ibm.*;

     class MyClass (){

              /*     */

              public static classMethod ( );           //……..

}

 

/*

*

*/

package com.fence

import com.ibm.*;

Class OneThow () {

     ……….

     MyClass.classMethod();          //……..

     ……

}

                   避免嵌套赋值;样例:

                                     //d=(a=b+c)+r;          //

                                     a=b+c ;              //….

                                     d=a+r;                //…..

                   避免一元表达式赋值;样例:

                                     /* 这是不允许的*/

                                     if ( i++ = m ++ ) {    }

使用括号   来界定表达式的结合顺序;样例:

     if ( ( i==j ) && ( m==n )) {

              /*    */

     }

         6、特殊注释

可以在程序中通过用EXECUTE表示该代码有问题但可执行,用FIXME 表示代码有问题切不可执行,梯例:

                            if ( isTrue ) [

                                               //EXECUTE

int num=0;

                                     num ++;

                                    

                            }

                            Else {

                                     //FIXME                    

                                     Num ++ ;                   //

                            }

 

         7、空格使用规定

                   空格一般应用于关键字与括号之间,例如下面的语句:

                            while (true) {

                                     /*     */

}

                   在参数列表中的逗号后面插入空格;

                   数学算式的操作数与运算符之间应该添加空格(二进制运算与一元运算除外);

         8、空行使用规定

在同一源文件的两个代码片断之间,或者在同一源文件的类与接口的定义之间可以插入两行空白行;

                   在两个方法之间插入一行空白行;

                   在方法内部的本地变量与第一个语句之间,插入一行空白行;

                   在块注释与单行注释之间插入一行空白行;

                   在方法内部的逻辑片断之间插入一行空白行;

 

第二节   语句块结构

通常情况下,一个类文件由以下几个语句块组成:

1、  声明定义语句块

变量声明定义示例

 

对象引用声明定义示例

 

 

        

2、  构造函数语句块

 

 

3、  析构函数语句块

 

 

4、  方法语句块

 

 

第三章   程序注释

第一节   块注释

代码块注释经常被用于提供文件、方法、数据结构、变量的意义与用途,以及算法的描述。块注释一般位于一个文件或一个方法的前面。在一个块注释之前一般有一空白行用于做区分代码与注释的边界,如:

         Code

 

         /**********

         *

         *这是一个块注释

         */

注:块注释以/*为开始,以*/为结束。

 

第二节   行注释

1)  单独行注释

单独行注释一般用于对较短的注释信息的描述,如果单行难以完整地描述注释信息,应该用块注释。

单独行注释例:

 

/*      */

 

2)  行尾注释

行尾注释紧跟在这一行代码之后进行注释,代码与注释存在于不可分割的同一行,为了使代码更加清晰,一般采用“代码行+tab8空格字符+行尾注释”的格式进行注释。例:

 

Code ;        //………….

Code;         /*    */

 

3)  行头注释

行头注释是用来注释代码的,使代码失去意义,行头注释在程序调试中经常被用到。

例:

 

 

第四章   声明

第一节   包的声明

包声明是为了避免类名重名冲突,在编译时产生二义性错误。

1、包声明格式以package+包名+分号(;)如下:

 

package 小写字母包名;

 

 

2、包声明命名规则有:

1)  包名应该是独一无二不可重复;

2)  包名通常情况下都应该是小写ASCII字母;

3)  包名一般是公司域名的倒序;

4)  域名之前的国家名称可以由一到两个英文字母做前缀用来表示国家名称,这个规则可以参考ISO标准3166

5)  域名后面的部分可以根据习惯命名;

 

格式样例:

package  com.fence.systembase;

 

 

第二节   接口声明

1)  接口声明定义格式:

public interface  Name

2)  实现接口方法时必须声明为public;

3)   

 

第三节   类声明

1)  必须有默认的构造函数;

示例:

 class A {

            Public a() {  }

 

            ……

   }

2)  避免在类的构造函数中初始化其它的类;

3)  避免在类的构造函数中给静态变量赋值;

4)  不准在类的构造函数中创建类的实例;

5)  类声明访问修饰符

Public

当一个类是另一个类的内部类时不允许声明为public;

当类不允许被包命名空间以外的类访问时,不允许声明为public;

6)  避免两个内部类之间的继承;

7)  避免超过4层以上的继承关系;

8)  在类中实现接口方法时,必须声明为pbulic;

 

第四节   抽象类声明

1)  抽象类声明格式:

Public abstract class A {

             ……

}

2)  不允许实例化;

3)  不允许作为主类;

4)  只能作为类继承使用;

 

第五节   变量声明

每一行代码,只声明一个变量。样例:

int  level;       //………

int  size;                   //………

 

避免低层声明与高层声明重得,这样会引起代码混乱并可以引发程序功能错误。

如:

int count;          //…………

 

myMethod(){

………….

         int count;          //……

…………..

}

 

变量声明代码放置在一个代码块的开始处。应该杜绝在使用时做变量声明,如:

if ( int i < int.length) {        //这种变量声明要杜绝

….

}

         正确样例:

         int i;

         i=0;

         if(i<int.length){..}

 

 

第五章   命名规范

第一节   文件

 

Naming Convention

命名规范

Must Follow or Not

是否必须遵循

Example

范例

源文件后缀为 .java

必须

HelloWorld.java.

字节码后缀为 .class

必须

HelloWorld.class

备注

l  Java(*.java)文件组织格式依序包括修订说明、包和导入、类和接口、类的成员等部分。

l  应把每个Java类放在单独的文件中(除内部类),但对于non-public的类来说,应该包含一个main()方法,因为它们不能在它们的上下文范围之外被调用。

 

第二节   包命名

Naming Convention

命名规范

Must Follow or Not

是否必须遵循

Example

范例

采用Internet域名格式命名

必须

com.fencer.package

必须为单数

必须

com.fencer.servlet

不是 com.fencer.servlets

备注Internet域名为 www.fencer.com ,所以包结构以com.fencer为前缀

 

第三节   接口

Naming Convention

命名规范

Must Follow or Not

是否必须遵循

Example

范例

英语单词字头大写,其他可以用大写或小写

必须

ThisIsAnInterfaceName

接口要I开头

必须

ISomeInterface

备注

 

第四节   

Naming Convention

命名规范

Must Follow or Not

是否必须遵循

Example

范例

英语单词字头大写,其他可以用大写或小写

必须

ThisIsAClassName

备注

 

 

第五节   方法的命名

 

Naming Convention

命名规范

Must Follow or Not

是否必须遵循

Example

范例

第一个英文单词首字母小写,

必须

openAccount()

getString()

类的获取方法的方法名采用被访问的字段名前加上前缀get

必须

getFirstName()

getLastName()

类的设置方法的方法名采用被访问的字段名前加上前缀set

必须

setFirstName()

setLastName()

类的布尔型的判断方法要求方法名使用单词 is 做前缀或者使用具有逻辑意义的单词

必须

isPersistent()

isString()

equal()

equals()

类的普通方法采用完整的英文描述说明成员方法功能,

必须

openFile()

addAccount()

备注

 

方法通常由动词组成,第一个字母应该小写,在多个单词混合的情况下,第一单词后的所有单词的第一个字母大写,其余字母小写。样例:

run();        //

getFast();                   //

getBackground();     //

在方法的声明部分,要提供对方法功能的描述,以及方法中返回值与参数的说明。样例:

/**

*显示系统信息方法

*@param message 系统信息参数

*@return message 返回系统信息

*

*

*

*

*/

public String showMessage ( String message ) {

         ……….;      //

 

         Return message;

}

第六节   参数

 

Naming Convention

命名规范

Must Follow or Not

是否必须遵循

Example

范例

参数的名字必须和变量的命名规范一致

必须

thisAClassParameter

使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字

建议

setCounter(int size)

{

this.size=size;

}

备注

 

 

第七节   变量的命名

 

Naming Convention

命名规范

Must Follow or Not

是否必须遵循

Example

范例

变量的名字必须以一个小写字母开头,后面的单词用大写字母开头

必须

username

thisIsAClassVariable

循环记数变量通常采用i, j, k或者counter

建议

i, j, k

counter

备注

l  对于使用O/R映射、开发工具自动生成变量等时,可以不采用本节要求的变量命名规范

变量的命名规则是,除了变量 ( variable ),所有对象的实例 ( instance ),类 (class ) 与类的常量 constant )的第一个字母应该小写,在多个单词混合的情况下第一个单词后的所有单词的第一个字母大写,其余字母小写;另外,变量的第一个字母不允许为下划线或者特殊字符如$等。变量名字要易记忆、易理解、要紧凑;避免单字符的变量。样例:

int  i ;      // 应该避免单字符的命名;

float  imageWidth ;        //这种命名是比较好的;

 

第八节   实例变量

 

Naming Convention

命名规范

Must Follow or Not

是否必须遵循

Example

范例

变量的名字必须以一个小写字母开头,后面的单词用大写字母开头

必须

username

thisAClassInstance

备注

 

第九节   数组

 

Naming Convention

命名规范

Must Follow or Not

是否必须遵循

Example

范例

数组的名字必须参照示例命名

必须

byte[] buffer

不是byte buffer[]

备注

 

第十节   常量的命名

 

Naming Convention

命名规范

Must Follow or Not

是否必须遵循

Example

范例

常量的名字必须都大写,下划线分隔

必须

final static int DEFAULT_HTTP_PORT=80

备注

 

常量一般采用大写字母单词命名,单词与单词之间用下划线 _)加以分割。样例:

static  final int MIN_WIDTH =14;

static  final int MAX_WIDTH = 1000;

static  final int GET_THE_MEMORY = 128 ;

 

第六章   语句

Simple Statement

         Example:

givInt- -;                      //正确的,可取的格式;

                   givInt+ +;                    //

                   givInt- -; givInt+ +;  //不可取的格式;

注:简单语句,通常是非常简短,在一个代码行内完成计算与赋值操作;

 

If  Statement

         Example:

         If  (   )                    //注释

         {

                   return;               //注释

         }

         Else

         {

                   break;                //注释

         }

 

         myExperssion(){

                  if (   )   return ;

                   if (   )   return;;

                   ………..

                  

                   /* 在一个方法块内应尽量避免多个if()语句出现 */

}

 

for Statement

1)在多重循环中,尽量将最长的循环放在最内层,最短的放在最外层,以减少循环层次间的切换次数;

         2)使用0值作为终结条件;

         3)禁止作数组拷贝使用;

         4)尽可能的避免在循环体内调用方法;

         5)避免在循环体内存取数组元素;

         6)有最终条件返回值,禁止以方法调用的方式作为循环值用;

7)  尽量避免在循环体内用try-catch语句块;

8)  循环体内有if 语句的,尽量放置在循环体外;

如:

        

        for ( int age=100; age >=0; age--) {

                   for ( int num=20; num >=0; num--) {

                   }

                  

         }

         更改为:

         for ( int num=20; num>=0; num--) {

                   for (int age=100; age>=0; age-- ) {

                   }

         }

 

         example:

         for (  ;  ;  ) {

         /*    */

}

 

while Statement

1)  while (parameter) 中的parameter 不准为最终条件方法调用返回值;如:

while ( isTrue() ) {

           /*     */

}

正确的格式为:

bool isTrue = isTrue ();

while (isTrue) {

}

 

2)   

        

        

         while () {

        

}

 

do while Statement

         do{

                  

         }while ( )

 

Switch Statement

         switch ( ) {

 

                   case 1 :

                            /*  */

                            break;

                   case 2 :

                            /*   */

                            break;

                   ……….

                   default:

                            /*    */

                            break;

                           

         }

return Statement

        

         return;

        

         string  firstName;           //

         return  firstName;                   //……. or /*    */

        

         注:return statement 返回 null的情况,

        

 

try-catch Statement

        

         try{

         /*       */

        

         }

catch (   ) {

/* Throwable 类是 Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类*之一)的实例时,才能通过 Java虚拟机或者 Java throw 语句抛出。类似地,只有此*类或其子类之一才可以是 catch 子句中的参数类型。   */

        

         }

         finally {

         /*    */

        

         }

        

        

第七章   表达式规则

第一节   操作符说明

一元操作符、二元操作符

第二节   操作符括号优先级说明

第三节   单一意图规则

表达式应该尽量表达单一意图,最好一个表达式只做一件事。如:赋值表达式就只负责为一个变量赋值,一个运算表达式就只负责完成一个运算过程。

第四节   方法返回值比较规则

杜绝在判断语句中直接通过方法的返回值作为条件判断的比较项。如:obj.getAge()返回一个整数而且变量 age 也是一个整数;

If ( obj.getAge()==age) {

}

上述语句在语法上没有任何问题,但有时会出现确会出现在两个量值相同的情况下会是假。为了避免这类问题的出现,采取下种格式:

int  tmp = obj.getAge();

if ( tmp == age ) {   

            /*     */

}

 

第五节   字符串比较规则

字符串(string)是java语言中的核心类,应用广泛。在比较两个字符串的值时,应使用string类中的equals () 方法专门比较字符串的值,避免使用“==”;例外,在使用string类中的intern () 方法后,使用“==”进行字符比较要比equals() 方法比较要效率高的多。

 

 

 

第八章   Java优化

第一节 String

String类是java语言中重要的核心类。Java语言中的string代表字符串类型的对象,可以存储16位的unicode字符序列及其长度。

规则:

1)  使用stringBuffer.append()方法串联字符串;

2)  禁止将string.length() 方法作为循环语句参数条件使用;

3)  使用toCharArray()方法,获取指定的字符;

4)  避免将字符转换成数字的;

样例:

String  str = “this is a string”;

stringBuffer tmp =new stringBuffer(str);

int len =str.length();

for ( int charLeng=len; charLeng>=0; charLeng--) {

tmp.append ( “second string” );

}

str = tmp.toString();

 

char ss[] = str.toCharArray();

int sslen=ss.length();

for ( int len=sslen; len>=0; len--) {

         if(ss[len]==’a’) {  }

}

 

第二节   arraylist 

1arraylist 为非线程安全,如果需要可使用如下方法将其转化为线程安全:

         list  list = Collections.synchronizedList ( new ArrayList() );

通过上述方法可以将ArrayList类标识为线程安全的对象。

2)调用ArrayList对象中的ensureCapacity()方法设置ArrayList初始化容量,提高添加新元素的速度,优化系统性能。

         示例:

         Final int N = 1000;

         Object obj = new Object();

         ArrayList list = new ArrayList();

         list.ensureCapacity(N);

         for (int i=N;i>=1;i--) {

                   list.add(obj);

         }

3)  ArrayList java语言专门提供用来处理数据元素列表的类之一,是一个数组对象并通过内部数组结构Object[]实现的。

4)  使用list接口解决ArrayListLinkedList的性能问题;方法是使用如下声明方式:

List list = new ArrayList();                void f (List list) { }

替代:

ArrayList list =new ArrayList();                                      void f( ArrayList list ) {   }

 

 

第三节   LinkedList

1LinkedListjava语言专门提供用来处理数据元素列表的类之二,是数据结构中的链表对象并通过将一系列的内部记录连接在一起实现的。

第四节   i/O 

操作文件读写时,必须要使用数据缓存流类;

对于大文件要使用压缩流方式;

第五节   数据格式化

数据格式化优先考虑通过操作符进行数据格式化信息串,其次是采用messageFormat类格式化信息串。

 

 

第九章   异常定义规则

第一节   异常

1、  创建定义异常从已有的异常类继承,并选择意思相近的异常类继承;

2、  捕获所有异常类exception ,要放在处理程序列表的末尾;

3、  使用异常链时,应该用initCause()方法而不是构造器;

4、  避免抛出空引用异常,即NullPointerException异常;

5、  保证异常处理的完整性;

格式如下:

try {  

} catch ( exception ex) { 

} finally {  

}

注:finally 做清理资源的工作;

6、  避免在构造函数里抛出异常;

7、  避免异常子类catch顺序颠倒;示例:

 

Class Annoyance extends Exception {  }

 

Class Sneeze extends Annoyance {   }

 

Public class Human {

 

         Public static void font() throw Sneezes,Annoyance {

                   Try {

 

                   }catch(Annoyance a ) {

 

                   }catch(Sneeze s) {

                   }

         }

}

 

第二节   抛出异常和捕获规则

 

1)         任何抛出异常的方法必须先声明异常,如下示例:

MyClass.java

{

 

   // Constructor

 

   public MyClass( String name )

            throws NullPointerException, llegalArgumentException

 

   {

 

            ...

 

   }

 

}

2)         异常声明后,调用异常对象的构造器抛出异常。如下示例:

MyClass.java

public MyClass( String name )

 

   throws NullPointerException, IllegalArgumentException

 

{

 

   if ( name == null )

 

            throw new NullPointerException( );

 

   if ( name.length == 0 )

 

            throw new IllegalArgumentException( );

 

   ...

 

}

Java异常都从Throwable类继承而来。

3)         trycatch声明捕捉异常。如下示例:

MyClass.java

try

{

 

   MyClass newobj = new MyClass( name );

 

}

 

catch ( NullPointerException e )

{

 

   //  Do something about it

 

}

 

catch ( IllegalArgumentException e )

{

 

   //  Do something about it

 

}

try中的语句产生异常时,在异常处理函数捕捉了该异常而又没有重新抛出异常时,则在执行完处理函数后,将跳出发生异常的try块,接着执行下面的语句。

    try中的语句产生异常时,在异常处理函数捕捉了该异常而又重新抛出异常时,则将把异常抛出到上一层,发生异常的语句之后的代码将不执行。

如果没处理相应异常的处理函数,将把异常抛出到上一层,发生异常的语句之后的代码将不执行。

如果想捕捉所有异常,只要捕捉Exception异常就行。

如果某段代码不管是否发生异常都要执行,那可把它放入finally块中,以finally进行清理。

 

第三节   获取异常信息常用函数

 

1)         String getMessage()getLocalizedMessage toString()取得异常对象中的信息。

2)         void printStackTrace()Throwable fillStackTrace()printStackTrace打印出Throwable和其call stack traceFillStackTrace则在调用点设立新的stack trace信息。

3     RuntimeException异常。RuntimeException及其子类所代表的异常我们在程序中不用进行捕捉,如果发生此类异常,Java会自动抛出相应的异常对象。

 

第四节   异常分类

 

1Checked Exception是指那些需要程序显式的处理(捕获或者继续抛出)的异常。在项目中Checked Exception主要可以分为以下三种:

1BizException

项目自己定义的业务异常,BizException下继承了若干个子异常。也就是说BizException是所有项目自定义异常的根类。

2RollbackableBizException

         项目自己定义的业务异常,是BizException的子类。

3Other Checked Exception

         其他非本项目定义的Checked Exception类异常

2Unchecked Exception是指那些不需要程序进行显式处理(捕获或继续抛出)的异常,如果程序需要处理这类异常则其处理方式和Checked Exception一样。在项目中Unchecked Exception 主要可以分为以下两类:

         1DataAccessException

这类异常主要是Spring框架定义的数据访问类异常,其具体类型根据数据库的不同和数据库所产生的错误的不同而不同。该类异常描述了数据库访问过程中所产生的错误。

 

                            2Other RuntimeException

                                     其他类型的RuntimeException,例如:NullPointException等。

 

 

第五节   异常使用原则

 

使用异常主要是为了报告系统运行中出现的非正常情况。目前异常使用的方法有两种。一种是使用不同的异常类来表示不同的异常,这些异常类的类名就表达了系统所处的非正常状态。另一种是系统中出现的所有异常都用很少的几个异常类来表示,通过这些异常类中Message来表达具体的异常信息。项目主要使用的的是后一种方法。但在某些主要的子系统或与外系统交互时也会采用一些第一种方法。

 Message主要由两部分组成KeyParam[],其中key的命名规则为:级别(1)_模块名(可选)_逻辑名,其中级别主要分为Warn(W)ErrorE)两个级别。模块名:指应用功能的名称。逻辑名:从某种角度上来说可以理解为异常的编码。Param[]是具体的异常信息的参数。其具体使用方法如下,首先应用程序从异常中获取Message,然后从Message中获取key值,根据key值从resouce文件中获得异常描述信息,将Param[]通过填空形式放入获得异常描述信息中形成一个完整的异常描述信息。

 

1、  需要事务RollBack则抛出RollbackableBizException

2、  如果不需要事务作RollBack操作则抛出BizException

3、  鼓励应用程序重用一些通用的UncheckedException异常,如IllegalArgumentsException, NullPointException等。

4、  大多数情况下DataAccessException这类异常应用程序不用关心,特别是DAO类的对象不用关心这类异常。它是Spring框架所抛出的数据库访问的异常。

 

第六节   异常处理原则

 

异常处理需要遵循几点基础原则

第一,能处理则进行处理和关心的异常,不能处理或不关心的异常则继续抛出。决不允许出现捕获异常但又不做任何处理或抛出操作,这样会丢失异常信息。

第二,异常抛出源需要在抛出异常之前将异常写入日志中。以备进行检查。

应用程序所处层次的不同其对异常的处理也有所差别。下面列出了每个层次的应用程序在处理异常的一些原则。

下图是项目中异常使用的一个图释:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


1、  web layer(web展示层)

 

该层将从Business layer获取的异常根据异常所传递的消息的不同来区分当前异常是否可恢复。这里指的可恢复是指当出现异常后操作人员可以通过改变输入来解决出现的异常。

按照可恢复性的不同,该层应用对异常的处理也有所区分。具体操作过程中该层根据获取异常Message来确定处理的方式。如果Message的级别是Warn则需要将异常信息显示到操作员录入页面并保留上次录入信息,如果Message级别是Error则需要将信息转向专门的异常显示页面显示异常信息。

1)  可恢复异常

 

这类异常处理的时候应将异常信息显示在用户输入的页面并保留相关的输入信息,以便让操作员通过修改输入来纠正异常

2)  不可恢复异常

 

该类异常由于无法通过简单的改变操作员的输入来进行纠正,因此这类异常也比较严重。需要将该类异常的信息转发到专门的异常信息显示页面上

 

2、  Business layer(业务层)

 

该层可以分为UCC(用例控制)层和Service(服务)层。对于该层的异常处理也应该分成两部分来看待。

1)  UCC LayerUCC层)

2)  Service Layer(服务层)

 

3、  Integration layer(整合层)

 

整合层根据数据源类型的不同异常的处理原则也不同。

1)  数据库

当数据源为数据库的时候,应用程序不需要捕捉数据库的异常或者Hibernate产生的异常(这些工作都有Spring框架完成)。在该层处理过程中如果出现异常则此类异常的严重等级都比较高,都需要做事务的RollBack操作。因此在这里出现异常都使用DataAccessException异常,当然具体异常类型可以为DataAccessException下的一个字类型。

2)  其他外部系统

数据源为其他外部系统的时候,该层对外部系统所产生的异常进行相应的封装。封装建议按照用异常类型来区分是什么异常的形式进行。这里抛出的异常一般都是特定的异常不是BizException类型的。Service在接收到该层抛出的异常以后根据异常的类型装换成相应Message放入BizException中重新抛出或者自己消化,但根据需要的不同也可以将异常直接重新抛出。

 

 

 

第十章   附录

 

 

1、正则表达式

常用转意符正则表达式:

转意符              匹配描述

//                                           匹配反斜线字符“/

/n                                           匹配换行符

/r                                           匹配回车符

 

字符类正则表达式:

字符                                     匹配描述

[abc]                                     a or b or c都可以匹配

[^abc]                                  除了a b c 外的任何字符

[a-zA-Z]                                a-z or A-Z 的所有字符,表示范围值

[a-z-[bc]]                              除了b c a-z的所有字符

[a-z-[^def]]                          匹配d e or f

 

预定义字符类正则表达式:

表达式                                 匹配描述

                                          匹配任意字符

/d                                           匹配09的数字

/D                                          不匹配09的数字,例如:[^0-9]

/s                                           匹配一个空白字符

/S                                           不匹配空白字符

/w                                          匹配一个字

/W                                         不匹配一个字

 

java语言中所有与正则表达式相关的类都在java.util.regex包中。

 

2Java保留字:

abstract            boolean             break                 byte                    case                   catch

char                    class                            const                  continue                     default               do

double               else                    extends             final                             finally                 float

for                       goto                   if                          implements               import               instanceof

int                       interface           long                    native                          new                    null

package            private               protected                   public                          return                short

static                 super                 switch                synchrortized            this                     throw

throws               transient           try                       void                              volatile              while

 

你可能感兴趣的:(java,exception,数据库,String,正则表达式,Class)