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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章