《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 其他 > 業(yè)界動(dòng)態(tài) > Java異常處理技術(shù)及EJB中的應(yīng)用

Java異常處理技術(shù)及EJB中的應(yīng)用

2009-02-25
作者:郭廣軍,羊四清,戴經(jīng)國(guó),賀文華

1 引言
傳統(tǒng)的基于函數(shù)返回錯(cuò)誤代碼的錯(cuò)誤處理方法存在明顯的不足,如程序邏輯復(fù)雜,結(jié)構(gòu)不清;可靠性差,維護(hù)不便;返回信息有限,不直觀需譯碼;返回代碼標(biāo)準(zhǔn)化困難,代碼復(fù)用率低;在面向?qū)ο蟮膽?yīng)用系統(tǒng)中,有些如構(gòu)造方法等沒(méi)有返回值而無(wú)法報(bào)告程序錯(cuò)誤。因此,在Java中新的錯(cuò)誤檢測(cè)和報(bào)告方法—異常處理機(jī)制應(yīng)運(yùn)而生。
異常是指中斷程序正常執(zhí)行流程的錯(cuò)誤事件,如程序打開(kāi)不存在的文件、裝載不存在的類、網(wǎng)絡(luò)連接中斷、被零除、訪問(wèn)數(shù)組越界、系統(tǒng)資源耗盡等。在Java中,異常[1](Exception,例外)是特殊的運(yùn)行錯(cuò)誤對(duì)象,是異常類的一個(gè)對(duì)象,而每個(gè)異常類代表一種運(yùn)行錯(cuò)誤,在異常類中封裝了該運(yùn)行錯(cuò)誤的信息和處理錯(cuò)誤的方法等內(nèi)容。Java異常處理機(jī)制的基本思想是由發(fā)現(xiàn)而不能處理錯(cuò)誤的方法引發(fā)一個(gè)異常對(duì)象,然后由該方法的直接或間接調(diào)用者捕獲并處理這個(gè)錯(cuò)誤。其優(yōu)越性有:在catch中傳播與捕獲錯(cuò)誤信息,實(shí)現(xiàn)了錯(cuò)誤代碼與業(yè)務(wù)邏輯的分離,結(jié)構(gòu)清晰;可對(duì)錯(cuò)誤類型分組并標(biāo)準(zhǔn)化;方便了對(duì)錯(cuò)誤的定位與維護(hù);能有效防止由于異常而導(dǎo)致程序運(yùn)行崩潰,可靠性高;強(qiáng)制程序員考慮程序的容錯(cuò)性、健壯性和安全性。

2? Java異常處理機(jī)制
2.1? 異常類
2.1.1? 系統(tǒng)定義的異常類
異常類用于處理異常,分為系統(tǒng)定義的異常類和用戶自定義的異常類[1]。在java.lang包中提供的Throwable類是異常類層次結(jié)構(gòu)的頂層類,Error類和Exception類是從Throwable類直接派生的兩個(gè)知名子類
Exception類:它代表了Java語(yǔ)言中異常的基本屬性,除Java預(yù)定義的由Exception類派生的諸多異常類外,還支持用戶擴(kuò)展Exception類來(lái)實(shí)現(xiàn)自定義異常類。其構(gòu)造函數(shù)主要有public Exception()和public Exception(String s)等;它從Throwable類繼承了若干方法,常用的有:public String toString()方法,用來(lái)返回異常類信息;public void printStackTrace()方法,默認(rèn)在當(dāng)前標(biāo)準(zhǔn)輸出設(shè)備上輸出當(dāng)前異常對(duì)象的堆棧使用軌跡。Exception類定義的是非致命性錯(cuò)誤,允許用戶編寫(xiě)代碼來(lái)處理這類錯(cuò)誤,并繼續(xù)程序的執(zhí)行。通常觸發(fā)異常(Exception)的原因有打開(kāi)的文件不存在;網(wǎng)絡(luò)連接中斷;操作數(shù)超過(guò)允許范圍;想要加載的類文件不存在;試圖通過(guò)空的引用型變量訪問(wèn)對(duì)象;數(shù)組下標(biāo)越界等。
Error類:它定義的錯(cuò)誤是致命性錯(cuò)誤,如虛擬機(jī)錯(cuò)誤、裝載錯(cuò)誤、動(dòng)態(tài)連接錯(cuò)誤,一般會(huì)導(dǎo)致程序停止執(zhí)行,通常是由于Java系統(tǒng)或執(zhí)行環(huán)境發(fā)生錯(cuò)誤(Error)而導(dǎo)致的。由于這類異常主要與硬件、運(yùn)行時(shí)系統(tǒng)有關(guān),而不是由用戶程序本身拋出的,因此用戶程序不對(duì)這類異常進(jìn)行處理。
需指出,除java.lang包中定義的異常處理之外,其他的Java包中也包括異常。實(shí)際上幾乎每個(gè)Java包都定義了相應(yīng)的異常類。此外,運(yùn)行時(shí)異常RuntimeException類及其派生子類是Java程序員不用處理的異常。Java創(chuàng)建者認(rèn)為運(yùn)行時(shí)異常不應(yīng)由程序來(lái)處理,而且程序也很難真正的對(duì)付運(yùn)行時(shí)異常。
2.1.2? 用戶自定義異常類
用戶自定義異常類是指擴(kuò)展Exception類或其他某個(gè)已經(jīng)存在的系統(tǒng)異常類或其他用戶異常類而形成新的異常類。可以給新的異常類定義新的屬性和方法,或重載父類的屬性和方法,并使這些屬性和方法能夠體現(xiàn)該類所對(duì)應(yīng)的錯(cuò)誤信息。要特別注意的是:第一? 一個(gè)方法被覆蓋時(shí),覆蓋的方法必須扔出與被覆蓋方法相同的異常或其異常類的子類;第二? 若父類拋出多個(gè)異常,則覆蓋方法只能拋出父類所拋出的異常的一個(gè)子集,或者說(shuō)不能拋出新的異常。
2.2? 基本機(jī)制與語(yǔ)法結(jié)構(gòu)
2.2.1? 基本機(jī)制
Java異常處理機(jī)制采用中斷模式[2],即引發(fā)并拋出異常后,中止正在執(zhí)行的程序塊,控制流轉(zhuǎn)至異常處理器,待完成異常處理后,再返回調(diào)用點(diǎn)繼續(xù)執(zhí)行。異常處理的基本算法是:
Step1:拋出異常,即創(chuàng)建一個(gè)異常對(duì)象并將它交給運(yùn)行時(shí)系統(tǒng)的過(guò)程;
Step2:捕獲異常,即找到異常處理程序的過(guò)程:運(yùn)行時(shí)系統(tǒng)從發(fā)生錯(cuò)誤的方法開(kāi)始回溯,在方法調(diào)用堆棧里向后搜索,直到找到能處理當(dāng)前發(fā)生的異常的處理程序的方法;
Step3:處理異常,即通過(guò)方法調(diào)用來(lái)實(shí)現(xiàn)對(duì)異常的處理;
Step4:終止異常處理。若運(yùn)行時(shí)系統(tǒng)在方法調(diào)用棧中遍歷了所有的方法而未找到合適的異常處理程序,則顯示缺省錯(cuò)誤并終止執(zhí)行運(yùn)行時(shí)系統(tǒng)的異常處理。
2.2.2? 語(yǔ)法結(jié)構(gòu)
Java異常處理機(jī)制通過(guò)throws、throw、try、catch和finally 5個(gè)關(guān)鍵詞來(lái)實(shí)現(xiàn),分為三個(gè)基本部分[3]。
·throws:此關(guān)鍵字統(tǒng)一定制并明確標(biāo)明了一個(gè)方法可能拋出的各種異常,這些異常是該方法定義的一部分。其實(shí)質(zhì)是允許將異常處理遞歸交給調(diào)用它的上一級(jí)方法去處理,此時(shí)Java編譯器會(huì)強(qiáng)制此方法的調(diào)用者必須將其放在調(diào)用方法的try、catch塊中以拋出并捕獲處理這些異常。
·throw:此語(yǔ)句用來(lái)拋出緊跟其后的一個(gè)異常對(duì)象給此方法的調(diào)用者,此異常對(duì)象可用new創(chuàng)建,或者是一個(gè)Throwable的實(shí)例句柄通過(guò)參數(shù)傳到catch中。因?yàn)橛脩糇远x的異常不能由系統(tǒng)自動(dòng)拋出,所以必須借助于throw語(yǔ)句來(lái)拋出各種錯(cuò)誤情況所對(duì)應(yīng)的異常,且要求在程序中的合適位置定義好用戶自定義的異常類。
·try-catch-finally:此語(yǔ)句是Java錯(cuò)誤處理的基本結(jié)構(gòu),主要用來(lái)捕獲和處理一個(gè)或多個(gè)異常。通常由try、catch、finally三個(gè)塊組成。ⅰ)try塊:將所有可能拋出異常的代碼部分放入try塊中;ⅱ)catch塊:用緊跟在try塊后面一個(gè)或多個(gè)catch子句來(lái)捕獲異常,其的目標(biāo)是處理異常,把變量設(shè)到合理的狀態(tài),并象沒(méi)有出錯(cuò)一樣繼續(xù)運(yùn)行。若一個(gè)子程序不處理這個(gè)異常,則可返回到上一級(jí)處理,如此不斷的遞歸向上直到最外一級(jí)。ⅲ)finally塊:finally是Java異常處理機(jī)制的精髓,使用finally可以維護(hù)對(duì)象的內(nèi)部狀態(tài)、清理非內(nèi)存資源、將系統(tǒng)恢復(fù)到應(yīng)該處于的狀態(tài)。若沒(méi)有finally,要實(shí)現(xiàn)其功能的代碼是很費(fèi)解的。finally塊是可選塊,若定義了finally塊,則不論try塊中有無(wú)異常產(chǎn)生,finally塊都會(huì)被執(zhí)行;甚至若在try或catch塊中執(zhí)行了return、break語(yǔ)句,finally塊也會(huì)被執(zhí)行,但要特別注意此時(shí)finally塊后面的語(yǔ)句并不會(huì)被執(zhí)行。只有在try或catch中執(zhí)行了System.exit(0)操作,才不會(huì)執(zhí)行finally塊。另要特別指出的是:捕獲異常時(shí),catch語(yǔ)句是按其位置由前至后依次對(duì)被拋出的異常對(duì)象進(jìn)行匹配捕獲,若有多個(gè)catch語(yǔ)句,則異常類要按從子類到父類的順序放置;在應(yīng)用技巧中,還可通過(guò)在try塊中由throw拋出“異常”,然后在catch塊中捕獲之,實(shí)現(xiàn)程序中業(yè)務(wù)邏輯控制流程的跳轉(zhuǎn)。
2.3? 異常處理的基本原則
對(duì)于非運(yùn)行時(shí)異常必須捕獲或聲明,而對(duì)運(yùn)行時(shí)異常則不必,可以交給Java運(yùn)行時(shí)系統(tǒng)來(lái)處理;對(duì)于自定義的異常類,通常把它作為Exception類的子類,且類名常以Exception結(jié)尾,不要把自定義的異常類作為RuntimeException類或Error的類的子類;在捕獲或聲明異常時(shí),要選取合適類型的異常類,注意異常類的層次,根據(jù)不同的情況使用一般或特殊的異常類;根據(jù)具體的情況選擇在何處處理異常,或者在方法內(nèi)捕獲并處理,或者用throws子句把它交給調(diào)用棧中上層的方法去處理;在catch語(yǔ)句中盡可能指定具體的異常類型,必要時(shí)使用多個(gè)catch;使用finally語(yǔ)句為異常處理提供統(tǒng)一的出口;若無(wú)法處理某個(gè)異常,則不捕獲它;若捕獲了一個(gè)異常,則要對(duì)它進(jìn)行適當(dāng)?shù)奶幚恚槐M量在靠近異常被拋出的地方捕獲異常;除非要向上層遞歸拋出異常,否則要在捕獲異常的地方將其記錄到日志中。

3? EJB中的異常處理
3.1? EJB異常處理

EJB(Enterprise JavaBean)是J2EE企業(yè)級(jí)應(yīng)用開(kāi)發(fā)的核心組件,EJB的分布式和事務(wù)屬性使得其異常處理成為一個(gè)更重要的問(wèn)題[4]。EJB中異常可分為三類[5]:ⅰ)JVM異常:由JVM拋出,是一種致命錯(cuò)誤。ⅱ)系統(tǒng)異常:一般由JVM以RuntimeException的子類拋出,是一種非受查異常。ⅲ)應(yīng)用程序異常:它是一種定制異常,由應(yīng)用程序或第三方類庫(kù)以Exception類或其子類拋出,是一種受查異常,通常由EJB方法的調(diào)用者來(lái)處理之。EJB容器攔截了EJB組件上的每一個(gè)方法調(diào)用,因此方法調(diào)用中發(fā)生的每一個(gè)異常也被EJB容器所攔截。EJB規(guī)范只處理應(yīng)用程序異常和系統(tǒng)異常這兩種類型的異常。
應(yīng)用程序異常:是指在遠(yuǎn)程接口的方法說(shuō)明中所聲明的異常,它不是遠(yuǎn)程異常RemoteException,也不應(yīng)繼承RuntimeException或其子類。但是,在遠(yuǎn)程接口方法的throws子句中聲明的非受查異常并不會(huì)被當(dāng)作應(yīng)用程序異常。應(yīng)用程序異常是業(yè)務(wù)工作流中的例外,當(dāng)這種類型的異常被拋出時(shí),客戶機(jī)可得到一個(gè)恢復(fù)選項(xiàng)。當(dāng)發(fā)生應(yīng)用程序異常時(shí),默認(rèn)情況下EJB容器不會(huì)自動(dòng)回滾事務(wù),只有被顯式說(shuō)明并通過(guò)調(diào)用關(guān)聯(lián)的EJBContext對(duì)象的setRollbackOnly()方法才能回滾事務(wù)。實(shí)際上,對(duì)于應(yīng)用程序異常EJB容器通常以它原本的狀態(tài)傳送給客戶機(jī)而不會(huì)以任何方式包裝或修改它。
系統(tǒng)異常:通常被定義為非受查異常,EJB方法不能從這種異常中恢復(fù)。當(dāng)EJB容器攔截到非受查異常時(shí),會(huì)自動(dòng)回滾事務(wù)并執(zhí)行必要的清理工作,然后把該非受查異常包裝到RemoteException類或其子類中并拋給客戶機(jī)。對(duì)于受查異常,若要使用EJB容器的內(nèi)務(wù)處理,則必須將受查異常作為非受查異常拋出。因此,每當(dāng)觸發(fā)受查系統(tǒng)異常時(shí),應(yīng)該對(duì)其原始的異常以javax.ejb.EJBException類或其子類方式包裝后拋出。由于EJBException本身是非受查異常,因此不需要在方法的throws子句中聲明它。EJB容器會(huì)自動(dòng)捕獲EJBException或其子類,并把它包裝到RemoteException中,然后拋給客戶機(jī)。
需指出,雖然EJB規(guī)范規(guī)定系統(tǒng)異常由應(yīng)用程序服務(wù)器記錄,但記錄格式會(huì)因應(yīng)用程序服務(wù)器的不同而異。為確保異常記錄格式的統(tǒng)一,方便對(duì)其進(jìn)行統(tǒng)計(jì)分析,在代碼中記錄異常是一種好的策略。此外,在EJB1.0規(guī)范中要求把受查系統(tǒng)異常以RemoteException拋出,而EJB 1.1及以上規(guī)范則規(guī)定EJB實(shí)現(xiàn)類絕不應(yīng)拋出RemoteException。
3.2? 關(guān)鍵技術(shù)
3.2.1? 日志機(jī)制

盡管用System.out.println()方法跟蹤異常方便,但開(kāi)銷大,對(duì)I/O處理的同步控制將大大降低系統(tǒng)吞吐量。缺省時(shí)堆棧跟蹤被輸出至控制臺(tái),但在實(shí)際的應(yīng)用系統(tǒng)中,通過(guò)瀏覽控制臺(tái)來(lái)查看異常跟蹤不太現(xiàn)實(shí)。因此,在大型應(yīng)用系統(tǒng)的開(kāi)發(fā)、測(cè)試和運(yùn)行等生命周期中,采用日志機(jī)制和恰當(dāng)?shù)木幋a策略,精確地記錄各種類型的異常,可以降低系統(tǒng)開(kāi)銷,提高軟件性能和質(zhì)量。知名的日志實(shí)用程序有兩種:Log4J[6]是Apache的Jakarta的一個(gè)開(kāi)放源代碼的項(xiàng)目,J2SE 1.4捆綁提供了日志處理包(java.util.logging)[7],它們的使用方法請(qǐng)參考相關(guān)文獻(xiàn)。
3.2.2? Decorators設(shè)計(jì)模式
在面向?qū)ο蟮某绦蛟O(shè)計(jì)中若用一個(gè)對(duì)象(the Decorators)包裝另外一個(gè)對(duì)象,被稱為Decorators設(shè)計(jì)模式。基于Decorators設(shè)計(jì)模式,通過(guò)包裝原始的異常消息并在EJB組件中將其重新拋出,以方便對(duì)該異常的查詢和訪問(wèn)。其次,由于Log4J只能記錄String消息,所以要利用Decorators設(shè)計(jì)模式定義一個(gè)專門(mén)類負(fù)責(zé)把堆棧跟蹤轉(zhuǎn)換成String,以獲取該堆棧跟蹤的String表示。
3.3? EJB異常處理策略
3.3.1? 常見(jiàn)EJB異常處理的不足
·拋出帶有出錯(cuò)消息的異常:此種方法存在異常內(nèi)容可能被“吞掉”的現(xiàn)象。
·記錄到控制臺(tái)并拋出一個(gè)異常:僅當(dāng)控制臺(tái)可用時(shí)調(diào)用者才能向后跟蹤。
·包裝原始的異常以保護(hù)其內(nèi)容:可能導(dǎo)致重復(fù)記錄,產(chǎn)品日志或控制臺(tái)不能被交叉引用。
3.3.2? EJB異常處理的優(yōu)化策略
·優(yōu)化應(yīng)用程序異常處理:由EJB開(kāi)發(fā)者顯式拋出,通常包裝了含義清楚消息,不必將其記錄到EJB層或客戶機(jī)層,而以一種直觀有意義的方式提供給最終用戶,并帶上其解決方案的途徑。
實(shí)體Bean一般是啞類,通常應(yīng)用程序異常主要來(lái)源于會(huì)話Bean。從實(shí)體Bean拋出的應(yīng)用程序異常類型通常是CreateException、FinderException、RemoveException及它們的子類。當(dāng)引用其它EJB遠(yuǎn)程接口時(shí),實(shí)體Bean會(huì)遇到RemoteException,在查找其它EJB組件時(shí)會(huì)遇到NamingException,若使用BMP實(shí)體Bean,則會(huì)碰到SQLException。與這些類似的受查系統(tǒng)異常應(yīng)該被捕獲,并被包裝起來(lái),作為EJBException或它的一個(gè)子類拋出。在優(yōu)化的EJB設(shè)計(jì)中,客戶機(jī)一般不直接調(diào)用實(shí)體Bean上的方法,而通過(guò)會(huì)話Bean間接訪問(wèn)實(shí)體Bean。若會(huì)話Bean調(diào)用相同的實(shí)體Bean方法,則要避免對(duì)異常的重復(fù)記錄。會(huì)話Bean和實(shí)體Bean處理系統(tǒng)異常的方式基本相似。可采用訪問(wèn)標(biāo)識(shí)技術(shù)避免對(duì)同一異常的重復(fù)記錄。
·優(yōu)化系統(tǒng)異常處理:比應(yīng)用程序異常處理更為復(fù)雜,它的發(fā)生不受EJB開(kāi)發(fā)者的控制且異常信息不直觀,需要對(duì)其原始異常進(jìn)行包裝,以清楚地表達(dá)系統(tǒng)異常的含義。
·優(yōu)化Web層設(shè)計(jì):通常把異常記錄到Web層本身,則易于實(shí)現(xiàn)且代碼簡(jiǎn)潔。這要求Web層必須是EJB層的唯一客戶機(jī),且Web層必須建立在業(yè)務(wù)委派(Business Delegate)、FrontController或攔截過(guò)濾器(Intercepting Filter)等模式和Struts或其它類似于MVC的框架基礎(chǔ)上。
實(shí)際應(yīng)用中,即使采用良好的異常處理策略,但由于編譯器和運(yùn)行時(shí)優(yōu)化,會(huì)限制使用堆棧跟蹤程序跟蹤異常的能力。通常把大的方法調(diào)用分割為更小的、更易于管理的塊,并提高代碼復(fù)用率;并將異常類型按需要?jiǎng)澐殖杉?xì)粒度的、具體的異常,在捕獲異常時(shí)則捕獲已規(guī)定好的具體類型的異常,避免捕獲所有類型的異常。

3.4? EJB異常處理實(shí)例
例1:ejbCreate()方法中的FinderException異常處理。其代碼如下:
public Object ejbCreate(RatepayingOrderValue value) throws CreateException {
try { if (value.getItemName() == null) {
throw new CreateException("不能創(chuàng)建報(bào)稅單!"); }
String taxpId = value.getTaxpayerId();
Taxpayer taxp = taxpayerHome.fingByPrimaryKey(taxpId);
this.taxpayer = taxp;
} catch (FinderException fe) {
//作為應(yīng)用程序異常,還是系統(tǒng)異常?
} catch (RemoteException re) {
//這是系統(tǒng)異常,并記錄在日志中。
throw ExceptionLogUtil.createLoggableEJBException(re);
}
return null;
}
例1中報(bào)稅單RatepayingOrder實(shí)體Bean的ejbCreate()方法試圖獲取納稅人Taxpayer實(shí)體Bean的一個(gè)遠(yuǎn)程引用,可能導(dǎo)致FinderException。此處,盡管可把FinderException當(dāng)作應(yīng)用程序異常或作系統(tǒng)異常,但是若把它當(dāng)系統(tǒng)異常則更好,因?yàn)檫@可以提高EJB組件對(duì)客戶機(jī)的透明性。同理,對(duì)于會(huì)話Bean或者實(shí)體Bean試圖創(chuàng)建另一個(gè)會(huì)話Bean,可能導(dǎo)致的CreateException,或者會(huì)話Bean在它的某個(gè)容器回調(diào)方法中獲得了一個(gè)FinderException等,都最好將其作為系統(tǒng)異常。此外,若考慮會(huì)話Bean在處理下報(bào)稅單時(shí),用戶須具有一個(gè)簡(jiǎn)歷,若沒(méi)有,則會(huì)話Bean將觸發(fā)ObjectNotFoundException異常,這時(shí)最好將其作為應(yīng)用程序異常拋出,以告知用戶其簡(jiǎn)歷丟失。
例2:logon()方法的InvalidUserDataException應(yīng)用程序異常處理。其代碼如下:
public void logon(String user, String password) throws InvalidUserDataException
{?if (user == null || password ==null)
??throw new InvalidUserDataException();
?serviceImpl.logon(user, password);
}
以下是應(yīng)用程序異常類InvalidUserDataException的定義。
public class InvalidUserDataException extends Exception
{? public InvalidUserDataException()
?{super(“用戶名或密碼不能為空!”); }
}

4? 結(jié)論
在企業(yè)級(jí)的大型軟件開(kāi)發(fā)中,嚴(yán)謹(jǐn)強(qiáng)大的Java異常處理機(jī)制為軟件質(zhì)量控制提供了有力的技術(shù)支持,提高了軟件的可讀性、可維護(hù)性、容錯(cuò)性和開(kāi)發(fā)效率。充分有效的利用Java異常處理機(jī)制、采用合適的異常處理策略,是提高EJB中異常處理的性能的有效途徑。

參考文獻(xiàn):
[1]? Bruce Eckel. Thinking in Java[M].Beijing: China Machine Press,2000.240-281.
[2]? 趙化冰,唐英,唐文彬,蘆東昕. Java異常處理[J]. 計(jì)算機(jī)應(yīng)用, 2003,12:46-48.
[3]? 張聰品,趙琛,糜宏斌. 異常處理機(jī)制研究[J].計(jì)算機(jī)應(yīng)用研究,2005,4:86-89.
[4]? [美]Chuck Cavaness Brian Keeton著,智慧東方工作室 譯. EJB 2.0企業(yè)級(jí)應(yīng)用程序開(kāi)發(fā)[M].北京:機(jī)械工業(yè)出版社,2002,3.294-310.
[5]? EJB異常處理的最佳做法. http://www.evget.com/view/article/viewArticle.asp?article=548
[6]? Log4J框架. http://jakarta.apache.org/log4j/docs/index.html
[7]? Java Logging API. http://java.sun.com/j2se/1.4/docs/api/java/util/logging/
package-summary.html

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,請(qǐng)及時(shí)通過(guò)電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
亚洲欧美久久久| 欧美精品在线一区二区三区| 亚洲精品视频啊美女在线直播| 午夜在线一区| 亚洲伊人伊色伊影伊综合网| 一区二区三区欧美视频| 亚洲精品在线二区| 亚洲国产精品成人综合| 亚洲国产成人av好男人在线观看| 精品粉嫩aⅴ一区二区三区四区| 国产日韩在线看片| 国产日韩欧美在线| 国产亚洲综合精品| 黄色日韩网站视频| 在线观看91精品国产麻豆| 狠狠色狠狠色综合人人| 激情成人av在线| 影院欧美亚洲| 亚洲国产高清一区| 最新成人av在线| 亚洲精品一区二区三区樱花| 亚洲精品一区二区三区樱花| 日韩网站在线观看| 在线一区日本视频| 亚洲永久免费视频| 欧美亚洲免费在线| 久久精品国产免费| 亚洲人成精品久久久久| 亚洲麻豆视频| 亚洲永久网站| 久久久久国产精品一区| 老司机aⅴ在线精品导航| 欧美成人一区二区| 欧美日韩一区二区三区在线视频 | 牛夜精品久久久久久久99黑人| 蜜臀a∨国产成人精品| 欧美电影免费| 欧美日韩视频一区二区三区| 国产精品婷婷午夜在线观看| 国产午夜精品福利| 亚洲国产视频一区| 亚洲天堂av在线免费观看| 午夜视频在线观看一区二区| 亚洲国产你懂的| 亚洲视频日本| 久久久久久久综合狠狠综合| 欧美精品一区二区三区视频 | 国产乱码精品| 亚洲电影第三页| 亚洲少妇一区| 亚洲第一区中文99精品| 在线视频欧美日韩精品| 欧美在线视频免费观看| 另类亚洲自拍| 国产精品国产自产拍高清av王其| 国产婷婷色综合av蜜臀av| 亚洲国产婷婷| 亚洲欧美日韩在线观看a三区| 亚洲国产另类精品专区| 亚洲图片在区色| 久久午夜精品一区二区| 欧美色图一区二区三区| 狠久久av成人天堂| 夜色激情一区二区| 亚洲电影欧美电影有声小说| 亚洲一级在线观看| 麻豆av一区二区三区久久| 欧美亚州韩日在线看免费版国语版| 国产一区二区三区直播精品电影 | 日韩视频免费在线| 欧美在线一二三区| 亚洲在线第一页| 欧美成人免费视频| 国产精品一区久久久久| 亚洲国产精品尤物yw在线观看| 亚洲与欧洲av电影| 一本久久青青| 久久综合九色综合久99| 国产精品亚洲а∨天堂免在线| 亚洲国产日韩在线| 欧美制服丝袜| 亚洲欧美高清| 欧美日韩国产一中文字不卡| 韩国精品在线观看| 亚洲欧美视频一区| 亚洲电影免费在线 | 国产精品日韩一区二区三区| 在线免费高清一区二区三区| 香蕉久久精品日日躁夜夜躁| 亚洲小说欧美另类社区| 欧美成人日韩| 国产亚洲精品bt天堂精选| 亚洲无人区一区| 9i看片成人免费高清| 久久综合色8888| 国产日韩欧美在线播放不卡| 亚洲素人一区二区| 亚洲天堂网在线观看| 欧美国产日韩一区二区三区| 韩国一区电影| 欧美在线观看天堂一区二区三区| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美黄色免费| 亚洲高清二区| 亚洲黄色在线| 免费在线观看成人av| 狠狠88综合久久久久综合网| 欧美一二三区精品| 欧美一区国产一区| 国产精品久久久久影院亚瑟 | 99av国产精品欲麻豆| 亚洲图片欧美一区| 一区二区三区四区国产精品| 欧美成人免费播放| 亚洲第一精品久久忘忧草社区| 久久av一区二区三区| 久久精品五月婷婷| 国产主播一区| 亚洲国产aⅴ天堂久久| 久久久激情视频| 国内视频精品| 亚洲国产另类 国产精品国产免费| 久久在线视频在线| 国语对白精品一区二区| 欧美在线影院| 乱中年女人伦av一区二区| 好看的日韩av电影| 亚洲国产99精品国自产| 免费欧美电影| 亚洲激情视频在线| 一区二区日韩| 国产精品v一区二区三区| 亚洲一区二区精品在线| 欧美一级专区| 国产一区二区电影在线观看| 亚欧成人在线| 免费91麻豆精品国产自产在线观看| 亚洲大片在线观看| 一本到12不卡视频在线dvd| 欧美视频日韩视频| 亚洲网站视频福利| 久久国产一区| 在线激情影院一区| 99精品欧美| 国产精品国产a级| 欧美一乱一性一交一视频| 久久婷婷麻豆| 亚洲欧洲日韩女同| 亚洲字幕在线观看| 国产亚洲欧美中文| 亚洲人成在线观看网站高清| 欧美日韩国产精品成人| 中文亚洲免费| 久久久久综合网| 亚洲国产婷婷香蕉久久久久久99 | 欧美日韩一区在线观看视频| 亚洲你懂的在线视频| 久久久久久夜精品精品免费| 亚洲国产岛国毛片在线| 亚洲男女自偷自拍图片另类| 国内精品久久久久久久影视蜜臀| 亚洲精品国产欧美| 国产精品卡一卡二| 亚洲国产老妈| 国产精品99免费看 | 欧美影院视频| 欧美精品一区二区三区久久久竹菊 | 亚洲欧美精品suv| 一色屋精品视频在线看| 亚洲天堂av图片| 激情成人av| 亚洲一区在线免费| 激情亚洲成人| 亚洲欧美久久| 亚洲黄色毛片| 久久激情婷婷| 亚洲免费观看高清在线观看 | 国产精品成人aaaaa网站| 欧美一区午夜精品| 欧美日韩精品是欧美日韩精品| 午夜免费久久久久| 欧美日韩国产bt| 亚洲福利视频网站| 国产精品激情| 99v久久综合狠狠综合久久| 国产欧美日韩综合精品二区| 亚洲美女免费精品视频在线观看| 国产日韩一区二区三区在线| 一区二区三区四区国产精品| 红桃视频一区| 亚洲欧美视频在线观看视频| 91久久国产综合久久蜜月精品 | 性18欧美另类| 亚洲精品欧美精品| 久久久天天操| 亚洲综合99| 欧美色播在线播放| 亚洲人成网站在线观看播放| 国产午夜精品理论片a级大结局| 亚洲一区视频在线|