• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      Java異常處理機(jī)制應(yīng)用研究?

      2014-08-07 12:09:48歐陽(yáng)宏基
      微處理機(jī) 2014年6期
      關(guān)鍵詞:編譯器語(yǔ)句代碼

      歐陽(yáng)宏基,葛 萌

      (咸陽(yáng)師范學(xué)院信息工程學(xué)院,咸陽(yáng)712000)

      Java異常處理機(jī)制應(yīng)用研究?

      歐陽(yáng)宏基,葛 萌

      (咸陽(yáng)師范學(xué)院信息工程學(xué)院,咸陽(yáng)712000)

      異常處理機(jī)制是Java程序設(shè)計(jì)中的一個(gè)重要方面,正確使用異常處理的策略和方法,能夠確保Java程序結(jié)構(gòu)的清晰性、易讀性和健壯性。分析了Java異常的體系結(jié)構(gòu),闡述了異常分類(lèi)與處理機(jī)制,提出了異常處理的一般原則和一種異常處理框架,并結(jié)合實(shí)際應(yīng)用對(duì)該框架進(jìn)行了詳細(xì)描述。

      Java異常處理機(jī)制;異常處理原則;異常處理框架

      1 引 言

      異常(又稱(chēng)為例外)是程序編譯或運(yùn)行時(shí)發(fā)生的可預(yù)料或不可預(yù)料的非正?,F(xiàn)象,可能會(huì)導(dǎo)致程序中斷或錯(cuò)誤結(jié)果[1]。異常是不可避免的,出現(xiàn)了什么樣的異常?由誰(shuí)來(lái)如何處理異常?如何從異常中恢復(fù)?這些問(wèn)題是任何一門(mén)編程語(yǔ)言都要解決的。傳統(tǒng)面向過(guò)程的程序語(yǔ)言(例如C語(yǔ)言)通常根據(jù)程序返回的某個(gè)特殊值或標(biāo)記,并且假定接收者會(huì)檢查該返回值或標(biāo)記,以此來(lái)判斷錯(cuò)誤是否發(fā)生[2]。這種處理方式會(huì)在程序的許多地方逐一檢查某個(gè)特定的錯(cuò)誤并加以處理,導(dǎo)致正常的業(yè)務(wù)流程和錯(cuò)誤處理代碼緊密耦合,不利于代碼的閱讀和維護(hù)。Java語(yǔ)言提供了一整套的、高效的、包括異常拋出、捕獲和處理的機(jī)制用于識(shí)別和處理異常,并且由Java編譯器強(qiáng)制執(zhí)行,將描述業(yè)務(wù)邏輯的代碼與處理異常的代碼分離開(kāi)來(lái),從而使代碼的可讀性、撰寫(xiě)、調(diào)試和維護(hù)都大大提高。

      2 Java異常體系結(jié)構(gòu)

      任何中斷程序正常流程的因素都被認(rèn)為是異常,由于Java是純面向?qū)ο蟮?,所以把異常?dāng)作對(duì)象來(lái)處理。JDK API中根據(jù)訪問(wèn)不同資源(例如內(nèi)存、文件、數(shù)據(jù)庫(kù)等)定義了許多具體異常類(lèi),同時(shí)允許開(kāi)發(fā)人員根據(jù)項(xiàng)目需要自行定義異常類(lèi)用來(lái)描述實(shí)際異常信息。層次結(jié)構(gòu)如圖1所示。

      Throwable是所有異常和錯(cuò)誤的父類(lèi),它主要包含三個(gè)方面的內(nèi)容:①線程創(chuàng)建時(shí)執(zhí)行堆棧的快照。②用以描述異常或錯(cuò)誤出現(xiàn)位置的消息字符串。③異常或錯(cuò)誤產(chǎn)生的原因。Throwable有兩個(gè)直接子類(lèi):Error和Exception,分別表示錯(cuò)誤和異常。其中異常Exception又包括兩大類(lèi):運(yùn)行時(shí)異常(RuntimeException)和非運(yùn)行時(shí)異常。運(yùn)行時(shí)異常又稱(chēng)為編譯器不檢查的異常(Unchecked Exception),非運(yùn)行時(shí)異常又稱(chēng)為編譯器檢查的異常(Checked Exception)。下面將詳細(xì)描述這些異常之間的區(qū)別與聯(lián)系:

      圖1 Java異常體系結(jié)構(gòu)

      2.1 Error與Exception

      Error類(lèi)層次結(jié)構(gòu)描述了Java運(yùn)行時(shí)系統(tǒng)的內(nèi)部錯(cuò)誤和資源耗盡錯(cuò)誤,例如OutOfMemoryError(內(nèi)存溢出錯(cuò)誤)、NoClassDefFoundError(類(lèi)定義找不到錯(cuò)誤)等。如果這些錯(cuò)誤發(fā)生(一般情況很少發(fā)生),Java虛擬機(jī)(JVM)不會(huì)檢查Error是否被處理,除了通知給用戶(hù)并且會(huì)盡力使程序安全的終止外,程序本身是無(wú)法處理這些錯(cuò)誤的。Exception分兩大類(lèi):運(yùn)行時(shí)異常和非運(yùn)行時(shí)異常。開(kāi)發(fā)人員在代碼中應(yīng)當(dāng)盡可能去處理這些異常,從而保證程序正確執(zhí)行。

      2.2 運(yùn)行時(shí)異常和非運(yùn)行時(shí)異常

      各種具體的運(yùn)行時(shí)異常都是RuntimeException類(lèi)及其子類(lèi)對(duì)象,例如ClassCastException(強(qiáng)制類(lèi)型轉(zhuǎn)換異常)、IndexOutOfBoundsException(下標(biāo)越界異常)等。因?yàn)檫@類(lèi)異常只有在程序運(yùn)行階段才能體現(xiàn)出來(lái),所以Java編譯器在編譯階段對(duì)代碼是否處理了該類(lèi)型異常不做檢查,編譯能正確通過(guò)。該類(lèi)型異常一般是由程序邏輯錯(cuò)誤引起的,所以應(yīng)從邏輯角度盡可能避免這類(lèi)異常的發(fā)生。各種具體的非運(yùn)行時(shí)異常都是RuntimeException以外的異常,直接從Exception繼承而來(lái),例如IOException(輸入輸出異常)、SQLException(數(shù)據(jù)庫(kù)操作異常)等。這類(lèi)異常在代碼中必須進(jìn)行處理,否則編譯不會(huì)通過(guò),所以又稱(chēng)為編譯器檢查異常。

      3 Java異常處理機(jī)制

      異常處理是指當(dāng)異常發(fā)生后,程序能夠轉(zhuǎn)向相關(guān)的異常處理代碼中并執(zhí)行嘗試性修復(fù)處理,然后根據(jù)修復(fù)處理的結(jié)果決定程序走向,使應(yīng)用程序能夠正常運(yùn)行、或降級(jí)運(yùn)行或安全地終止應(yīng)用程序的執(zhí)行,以提高應(yīng)用系統(tǒng)的可靠性[3]。Java異常處理機(jī)制通過(guò)提供5個(gè)關(guān)鍵字用來(lái)完成對(duì)異常的拋出、捕獲和處理這三個(gè)過(guò)程,分別是:try、catch、finally、throw、throws。前三個(gè)關(guān)鍵字可分別包含獨(dú)立的代碼段依次用來(lái)拋出異常、匹配并捕獲異常和處理異常;后兩個(gè)關(guān)鍵字用來(lái)將當(dāng)前方法所產(chǎn)生的異常聲明拋出,將異常的捕獲和處理操作交給當(dāng)前方法的調(diào)用者。其中try、catch和finally這三個(gè)關(guān)鍵字所包含的代碼段的執(zhí)行情況如圖2所示:其中左邊表示沒(méi)有異常產(chǎn)生時(shí)的執(zhí)行流程,右邊表示異常發(fā)生時(shí)的執(zhí)行流程。

      圖2 try catch finally代碼段的執(zhí)行情況

      (1)try代碼段:包含在try中的代碼段可能有多條語(yǔ)句會(huì)產(chǎn)生異常。但程序的一次執(zhí)行過(guò)程中如果產(chǎn)生異常,只可能是這些異常中的某一個(gè),該異常對(duì)象由Java運(yùn)行時(shí)系統(tǒng)生成并拋出,try中產(chǎn)生異常語(yǔ)句之后的語(yǔ)句都不會(huì)被執(zhí)行;如果這次執(zhí)行過(guò)程中沒(méi)有產(chǎn)生異常,那么try中所有的語(yǔ)句都會(huì)被執(zhí)行。

      (2)catch代碼段:捕獲try中拋出的異常并在其代碼段中做相應(yīng)處理,catch語(yǔ)句帶一個(gè)Throwable類(lèi)型的參數(shù),表示可捕獲異常的類(lèi)型。一般情況下catch代碼段的數(shù)量由try中所拋出的異常個(gè)數(shù)決定。當(dāng)try中代碼產(chǎn)生的異常被拋出后,catch代碼段按照從上到下的順序(如果異常類(lèi)型有父子關(guān)系,那么子異常所在的catch代碼段位于父異常所在catch代碼段的上方)將異常類(lèi)型與自己參數(shù)所指向的異常類(lèi)型進(jìn)行匹配,若匹配成功表示異常被捕獲,程序轉(zhuǎn)而執(zhí)行當(dāng)前catch中的代碼,后面所有的catch代碼段都不會(huì)被執(zhí)行;如果匹配不成功,交給下一個(gè)catch進(jìn)行匹配;如果所有catch都不匹配,表示當(dāng)前方法不具備處理該異常的能力,對(duì)于這種情況如果是一個(gè)非運(yùn)行時(shí)異常,為了編譯器通過(guò),必須使用throws關(guān)鍵字聲明拋出。

      (3)finally代碼段:該代碼段不是必須有的,但如果有,一定緊跟在最后一個(gè)catch代碼段后面,作為異常處理機(jī)制的統(tǒng)一出口。無(wú)論try中是否產(chǎn)生異常,finally中的代碼總在當(dāng)前方法返回之前無(wú)條件執(zhí)行(除非已經(jīng)執(zhí)行了要終止程序的System.exit()方法)。

      (4)throw關(guān)鍵字用來(lái)在方法體內(nèi)部創(chuàng)建Throwable類(lèi)型的異常對(duì)象并將其拋出,如果是非運(yùn)行時(shí)異常,還必須結(jié)合throws關(guān)鍵字在方法頭部聲明拋出該異常類(lèi)型,表明當(dāng)前方法不具備處理該異常的能力,將異常的處理任務(wù)延遲到當(dāng)前方法的調(diào)用者。當(dāng)前方法的調(diào)用者必須檢查、處理或者繼續(xù)拋出被調(diào)用方法拋出的異常。如果所有方法都層層上拋獲取的異常,最終會(huì)在main方法中尋找對(duì)應(yīng)的catch代碼段。如果main中也沒(méi)有對(duì)異常進(jìn)行捕獲,那么JVM將通過(guò)控制臺(tái)打印該異常消息和堆棧信息,同時(shí)程序也會(huì)終止。

      (5)throws關(guān)鍵字用來(lái)在方法頭部聲明方法可能會(huì)拋出的某些異常。僅當(dāng)拋出了非運(yùn)行時(shí)異常,該方法的調(diào)用者才必須處理或者重新拋出該異常。如果方法的調(diào)用者無(wú)法處理該異常,應(yīng)該繼續(xù)拋出而不是在catch中向控制臺(tái)打印異常發(fā)生時(shí)的堆棧信息,雖然這樣處理對(duì)程序調(diào)試有幫助,但當(dāng)程序交付給客戶(hù)運(yùn)行后,printStackTrace這樣的代碼就不具備處理異常的意義了。

      4 異常處理的一般原則[4-7]

      4.1 盡可能較早處理異常

      一般情況下,try-catch語(yǔ)句不會(huì)對(duì)應(yīng)用的性能造成很大影響。僅僅當(dāng)異常發(fā)生時(shí),Java虛擬機(jī)需要執(zhí)行額外的操作來(lái)定位處理異常的代碼段,從而會(huì)對(duì)系統(tǒng)性能產(chǎn)生負(fù)面影響。如果拋出異常的代碼段和捕獲異常的代碼段在同一方法中,此種情況對(duì)性能的影響最小;如果Java虛擬機(jī)必須搜索方法調(diào)用棧來(lái)尋找異常處理的代碼段,對(duì)性能的影響就比較大,尤其當(dāng)異常處理代碼段位于方法調(diào)用棧的底部時(shí)。因此,不應(yīng)該使用異常處理機(jī)制來(lái)控制程序的正常流程,而應(yīng)該確保僅僅在程序中可能出現(xiàn)異常的地方使用try-catch語(yǔ)句。而且應(yīng)該使異常處理代碼位于適當(dāng)?shù)膶哟?,如果?dāng)前方法具備處理某種異常的能力,就盡量處理而不是把能處理的異常拋給方法的調(diào)用者。

      4.2 對(duì)異常進(jìn)行轉(zhuǎn)譯

      異常轉(zhuǎn)譯就是將一種異常轉(zhuǎn)換為另一種新的異常,使得新的異常更能準(zhǔn)確描述程序產(chǎn)生異常的原因。因?yàn)槿魏涡问降漠惓:湾e(cuò)誤都是Throwable的子類(lèi),而且任何一個(gè)異常類(lèi)都包含接收一個(gè)Throwable類(lèi)型參數(shù)的構(gòu)造方法,這樣就為異常轉(zhuǎn)譯提供了支持。異常轉(zhuǎn)譯通常有三種情況,如圖3所示。

      圖3 異常轉(zhuǎn)譯

      (1)表示將錯(cuò)誤轉(zhuǎn)譯為編譯器檢查的異常并繼續(xù)拋出。這樣做的目的是為了最大限度避免因錯(cuò)誤發(fā)生而導(dǎo)致的系統(tǒng)掛起。例如SpringWEB框架中,org.springframework.web.servlet.DispatcherServlet的doDispatch()方法中,將捕獲的錯(cuò)誤轉(zhuǎn)譯為一個(gè)NestedServletException異常。

      (2)表示將編譯器檢查的異常轉(zhuǎn)譯為Runtime-Exception??赡芤?yàn)楫?dāng)前方法為了更好的描述業(yè)務(wù)邏輯而不方便對(duì)異常進(jìn)行有效處理,轉(zhuǎn)譯為RuntimeException交給上層調(diào)用者來(lái)處理。例如DAO是Java EE中數(shù)據(jù)持久層常用的一種設(shè)計(jì)模式,如果采用JDBC來(lái)訪問(wèn)數(shù)據(jù)庫(kù)就必須對(duì)SQLException這個(gè)受檢查的異常進(jìn)行處理。為了將這個(gè)異常交給上層調(diào)用者,將SQLException轉(zhuǎn)譯為另外一個(gè)新的異常-DAOException(開(kāi)發(fā)人員自己定義的),示例代碼如下所示:

      e是一個(gè)SQLException類(lèi)型的異常對(duì)象。

      (3)表示將錯(cuò)誤轉(zhuǎn)譯為RuntimeException。這樣做也是為了將錯(cuò)誤信息交給上層調(diào)用者進(jìn)行統(tǒng)一處理,不過(guò)此種情況在實(shí)際開(kāi)發(fā)中較少使用。

      4.3 在catch中指定具體的異常類(lèi)型

      不要使用catch(Exception ex)這樣的語(yǔ)句來(lái)捕獲異常,雖然這樣能編譯通過(guò)而且不用仔細(xì)分析try代碼段中異類(lèi)的類(lèi)型。根據(jù)圖1得知所有的異常都直接或間接從java.lang.Exception繼承而來(lái),根據(jù)Java上泛型原理,任何一個(gè)異常都會(huì)和catch(Exception ex)這樣的代碼匹配,導(dǎo)致子類(lèi)異常對(duì)象“喪失”了被拋出時(shí)的上下文,那么在catch代碼段中就無(wú)法根據(jù)不同異常類(lèi)型做出不同的處理,也就違背了異常處理的初衷。所以catch語(yǔ)句應(yīng)當(dāng)盡量指定具體的異常類(lèi)型。

      4.4 嚴(yán)格控制try代碼段的容量

      不要把大量的語(yǔ)句都放在某個(gè)單一的try代碼段中,因?yàn)橐淮蠖握Z(yǔ)句中可能會(huì)有不同地方拋出不同的異常。應(yīng)該仔細(xì)分析一大塊代碼中哪些行代碼會(huì)拋出什么樣的異常,結(jié)合實(shí)際程序邏輯,將這些代碼拆分到不同的try代碼段中并結(jié)合具體的異常分別進(jìn)行處理。雖然這樣做增加了try的數(shù)量,但是減少了try代碼段中的代碼行數(shù),并且使得異常類(lèi)型容易分析、代碼易于閱讀。例如采用JDBC進(jìn)行數(shù)據(jù)庫(kù)編程通常都要執(zhí)行①加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)、②創(chuàng)建Connection對(duì)象、③創(chuàng)建PreparedStatemnt或Statement對(duì)象執(zhí)行SQL操作、④釋放連接等資源這4個(gè)步驟。由于步驟①可能會(huì)產(chǎn)生ClassNotFoundException,步驟②③④可能會(huì)產(chǎn)生SQLException,所以應(yīng)該將①放在一個(gè)try代碼段中,②③④放在另外一個(gè)try代碼段中分別進(jìn)行捕獲和處理。

      4.5 合理使用finally代碼段

      雖然Java語(yǔ)言提供了垃圾回收機(jī)制來(lái)自動(dòng)釋放不再被引用的對(duì)象空間,但是如果程序中用到了內(nèi)存以外的資源,例如IO流、Socket網(wǎng)絡(luò)連接以及JDBC數(shù)據(jù)庫(kù)訪問(wèn)之類(lèi)的操作,即使發(fā)生了異常,也需要通知當(dāng)前操作系統(tǒng)正確釋放分配給JVM的底層資源。因此,必須把釋放資源之類(lèi)的代碼(基本都是調(diào)用相應(yīng)的close方法)放到finally代碼段中,從而確保無(wú)論異常發(fā)生與否,釋放資源之類(lèi)的代碼總是會(huì)被執(zhí)行。如果finally中還有拋出異常的語(yǔ)句,那么就必須通過(guò)try-catch代碼段對(duì)相應(yīng)異常進(jìn)行捕獲并處理,而不能再聲明拋出了。

      5 一個(gè)高效合理的異常處理框架

      對(duì)于一個(gè)應(yīng)用系統(tǒng)來(lái)說(shuō),異常信息不但要讓開(kāi)發(fā)人員看到而且也要讓用戶(hù)看到。對(duì)用戶(hù)而言,異常信息要簡(jiǎn)單明了、便于理解;對(duì)開(kāi)發(fā)人員而言,異常要便于處理。由于目前Java應(yīng)用的開(kāi)發(fā)都是采用分層原理,每一層都完成特定的功能,在每一層都有可能產(chǎn)生異常,如果在每一層都處理異常會(huì)加重程序員的負(fù)擔(dān)而且影響代碼的易讀性,因此需要選擇一個(gè)合適的位置對(duì)異常進(jìn)行集中處理。

      由于Java支持自定義異常,所以創(chuàng)建自定義異常-AppRuntimeException繼承自RuntimeException,如圖4所示。根據(jù)4.2節(jié)原理其他異常都能轉(zhuǎn)譯為AppRuntimeException。在AppRuntimeException下層存在著各種具體的異常和錯(cuò)誤,可以將錯(cuò)誤和非運(yùn)行時(shí)異常都向AppRuntimeException轉(zhuǎn)譯,這樣做有兩大優(yōu)點(diǎn):①最大限度地避免因錯(cuò)誤發(fā)生而導(dǎo)致的系統(tǒng)崩潰;②使程序代碼更加簡(jiǎn)潔,有利于錯(cuò)誤和異常的統(tǒng)一處理。AppRuntimeException異常的下層可根據(jù)Java EE分層開(kāi)發(fā)的原理再自行定義不同的子類(lèi)異常,例如持久化層的AppDAOException異常。由于持久層的實(shí)現(xiàn)技術(shù)有多種,例如JDBC、Hibernate、TopLink等。這些不同技術(shù)都有最“原始”的異常,例如SQLException、HibernateException等,考慮到松散耦合和可移植性,這些具體異常要向AppDAOException轉(zhuǎn)譯,在轉(zhuǎn)譯過(guò)程中可通過(guò)print-StackTrace打印具體異常信息,方便開(kāi)發(fā)人員調(diào)試。通過(guò)異常的層層上拋,如果是Web項(xiàng)目,可以在Servlet中或者Struts框架的Action中對(duì)AppRuntimeException進(jìn)行處理[8],并調(diào)用相應(yīng)的錯(cuò)誤頁(yè)面將異常信息簡(jiǎn)明的顯示給用戶(hù);如果是桌面應(yīng)用,可以在窗體類(lèi)(Frame以及子類(lèi))中對(duì)異常進(jìn)行集中處理,并調(diào)用相應(yīng)的Dialog對(duì)象框?qū)惓P畔@示給用戶(hù)。

      圖4 異常處理框架

      6 結(jié)束語(yǔ)

      異常處理機(jī)制是Java語(yǔ)言進(jìn)行軟件開(kāi)發(fā)和測(cè)試的一個(gè)重要方面。闡述了Java的異常體系結(jié)構(gòu),詳細(xì)描述了Java的異常處理機(jī)制,包括try、catch、finally、throw和throws關(guān)鍵字的用法和意義。總結(jié)了一些異常處理時(shí)應(yīng)遵循的原則,并結(jié)合實(shí)際項(xiàng)目開(kāi)發(fā)需求,提出了一種異常處理框架。綜合運(yùn)用這些策略和方法,可以使開(kāi)發(fā)人員編寫(xiě)出更加簡(jiǎn)潔、高效的Java代碼。

      [1]杜春濤.Java 6基礎(chǔ)教程[M].北京:清華大學(xué)出版社,2011:190-192.

      [2][美]Bruce Eckel著.Java編程思想(第二版)[M].侯捷,譯.北京:機(jī)械工業(yè)出版社,2002:382-383.

      [3]王新雨,須文波,柴志雷.Java虛擬機(jī)中異常機(jī)制實(shí)時(shí)性的研究及實(shí)現(xiàn)[J].計(jì)算機(jī)工程與應(yīng)用,2008,44(34):84-86.

      [4]陳紅躍,張宏軍,陳剛.Java異常處理策略研究[J].計(jì)算機(jī)技術(shù)與發(fā)展,2012,22(7):9-12.

      [5]趙智.Java異常處理機(jī)制使用經(jīng)驗(yàn)與技巧[J].百色學(xué)院學(xué)報(bào),2008,21(3):102-106.

      [6]韓瑞峰.Java異常處理機(jī)制及應(yīng)用研究[J].忻州師范學(xué)院學(xué)報(bào),2012,28(2):25-27.

      [7]楊厚群,陳靜.Java異常處理機(jī)制的研究[J].計(jì)算機(jī)科學(xué),2007,34(3):286-289.

      [8]劉淑華.J2EE項(xiàng)目中一種新的錯(cuò)誤處理方法[J].計(jì)算機(jī)應(yīng)用與軟件,2013,30(7):143-145.

      Application Research of Java Exception Hand ling Mechanism

      OUYANG Hong-ji,GE Meng
      (Information Engineering College,Xianyang Normal University,Xianyang 712000,China)

      The exception handling mechanism is an important aspect in Java programming,the strategies and methods for proper use of exception handling can ensure the clarity,legibility and robustness of Java Program Structure.The architecture of Java exceptions is analyzed,the exception handling mechanism of classification is described,and its general principles and framework are presented.The framework combined with the practical application is described in details.

      Java Exception Handling Mechanism;Exception Handling Principles;Exception Handling Framework

      10.3969/j.issn.1002-2279.2014.06.019

      TP311

      :A

      :1002-2279(2014)06-0066-04

      咸陽(yáng)師范學(xué)院專(zhuān)項(xiàng)科研計(jì)劃項(xiàng)目(12XSYK070)

      歐陽(yáng)宏基(1982-),男,陜西寶雞人,講師,碩士研究生,主研方向:軟件工程、Java EE應(yīng)用。

      2014-04-01

      猜你喜歡
      編譯器語(yǔ)句代碼
      重點(diǎn):語(yǔ)句銜接
      基于相異編譯器的安全計(jì)算機(jī)平臺(tái)交叉編譯環(huán)境設(shè)計(jì)
      創(chuàng)世代碼
      創(chuàng)世代碼
      創(chuàng)世代碼
      創(chuàng)世代碼
      精彩語(yǔ)句
      通用NC代碼編譯器的設(shè)計(jì)與實(shí)現(xiàn)
      如何搞定語(yǔ)句銜接題
      編譯器無(wú)關(guān)性編碼在微控制器中的優(yōu)勢(shì)
      堆龙德庆县| 沁水县| 登封市| 德昌县| 河北区| 诸城市| 安阳县| 黔西县| 东光县| 焦作市| 剑阁县| 剑川县| 贵德县| 黎平县| 柯坪县| 乌审旗| 枣强县| 宝清县| 万荣县| 融水| 勐海县| 普定县| 黎平县| 景德镇市| 南平市| 灯塔市| 沙湾县| 钟山县| 岳阳县| 新建县| 苏尼特左旗| 临漳县| 乌拉特前旗| 石嘴山市| 祁东县| 墨江| 忻城县| 灌云县| 天镇县| 绿春县| 拜泉县|