1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      java中代碼分離的好處 java中代碼分離的好處有哪些

      代碼分離形式是什么 使用代碼分離形式有什么好處

      寫在了CSS當(dāng)中,使得頁面體積容量變得更小。相對于表格嵌套的方式,DIV+CSS將頁面獨(dú)立成更多的區(qū)域,在打開頁面的時候,逐層加載。而不像表格嵌套那樣將整個頁面圈在一個大表格里,使得加載速度很慢。

      創(chuàng)新互聯(lián)專注于企業(yè)全網(wǎng)營銷推廣、網(wǎng)站重做改版、徽縣網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5響應(yīng)式網(wǎng)站商城網(wǎng)站定制開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為徽縣等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

      2、降低流量費(fèi)用

      頁面體積變小,瀏覽速度變快,這就使得對于某些控制主機(jī)流量的網(wǎng)站來說是最大的優(yōu)勢了。

      3、修改設(shè)計時更有效率

      由于使用了DIV+CSS制作方法,在修改頁面的時候更加容易省時。根據(jù)區(qū)域內(nèi)容標(biāo)記,到CSS里找到相應(yīng)的ID,使得修改頁面的時候更加方便,也不會破壞頁面其他部分的布局樣式。

      4、保持視覺的一致性

      DIV+CSS最重要的優(yōu)勢之一:保持視覺的一致性;以往表格嵌套的制作方法,會使得頁面與頁面,或者區(qū)域與區(qū)域之間的顯示效果會有偏差。而使用DIV+CSS的制作方法,將所有頁面,或所有區(qū)域統(tǒng)一用CSS文件控制,就避免了不同區(qū)域或不同頁面體現(xiàn)出的效果偏差。

      5、更好地被搜索引擎收錄

      由于將大部分的HTML代碼和內(nèi)容樣式寫入了CSS文件中,這就使得網(wǎng)頁中正文部分更為突出明顯,便于被搜索引擎采集收錄。

      6、對瀏覽者和瀏覽器更具親和力

      我們都知道網(wǎng)站做出來是給瀏覽者使用的,對瀏覽者和瀏覽器更具親和力,DIV+CSS在這方面更具優(yōu)勢。由于CSS富含豐富的樣式,使頁面更加靈活性,它可以根據(jù)不同的瀏覽器,而達(dá)到顯示效果的統(tǒng)一和不變形。

      同時也不能輕視DIV+CSS的副面作用:

      1、DIV+CSS盡管不是高不可及,但至少要比表格定位復(fù)雜的多,即使對于網(wǎng)站設(shè)計高手也很容易出現(xiàn)問題,更不要說初學(xué)者了。

      2、CSS網(wǎng)站制作的設(shè)計元素通常放在1個外部文件中,或幾個文件,有可能相當(dāng)復(fù)雜,甚至比較龐大,如果CSS文件調(diào)用出現(xiàn)異常,那么整個網(wǎng)站將變得慘不忍睹。

      3、雖然說DIV+CSS解決了大部分瀏覽器兼容問題,但是也有在部分瀏覽器中使用出現(xiàn)異常,比如火狐瀏覽器,在IE中顯示正常的頁面,到了火狐瀏覽器中可能會面目全非。當(dāng)然這應(yīng)該是瀏覽器的問題,但是可以說在目前來看,DIV+CSS還沒有實(shí)現(xiàn)所有瀏覽器的統(tǒng)一兼容。

      4、DIV+CSS對搜索引擎優(yōu)化與否,取決于網(wǎng)頁設(shè)計的專業(yè)水平,而不是DIV+CSS本身。DIV+CSS網(wǎng)頁設(shè)計并不能保證網(wǎng)頁對搜索引擎的優(yōu)化,甚至不能保證一定比HTML網(wǎng)站有更簡潔的代碼設(shè)計,何況搜索引擎對于網(wǎng)頁的收錄和排序顯然不是以是否采用表格和CSS定位來衡量,這就是為什么很多傳統(tǒng)表格布局制作的網(wǎng)站在搜索結(jié)果中的排序靠前,而很多使用CSS及web標(biāo)準(zhǔn)制作的網(wǎng)頁排名依然靠后的原因。因?yàn)閷τ谒阉饕娑裕W(wǎng)站結(jié)構(gòu)、內(nèi)容、相關(guān)網(wǎng)站鏈接等因素始終是網(wǎng)站優(yōu)化最重要的指標(biāo)。

      Java Web編程技術(shù)什么是代碼分離形式

      代碼分離形式 就是將代碼拆分開成多個文件.通過引用的形式調(diào)用組合在一起使用.

      比如你的jsp頁面里面會有很多的CSS樣式. 一般簡單的就是在寫JSP頁面的時候 CSS樣式也一起寫在了頁面元素的屬性里面..使用代碼分離就是單獨(dú)寫CSS樣式文件,這樣修改的時候 只需要去找CSS樣式文件.簡化代碼,增加代碼可讀性,易于修改.同時瀏覽器加載的時候也會快一些

      java的MVC是什么?有什么作用?

      一、什么是MVC

      Model:模型層

      View:視圖層

      Controller:控制層

      MVC (Modal View Controler)本來是存在于Desktop程序中的,M是指數(shù)據(jù)模型,V是指用戶界面,C則是控制器。使用MVC的目的是將M和V的實(shí)現(xiàn)代碼分離,從而使同一個程序可以使用不同的表現(xiàn)形式。比如一批統(tǒng)計數(shù)據(jù)你可以分別用柱狀圖、餅圖來表示。C存在的目的則是確保M和V的同步,一旦M改變,V應(yīng)該同步更新。

      模型-視圖-控制器(MVC)是Xerox PARC在八十年代為編程語言Smalltalk-80發(fā)明的一種軟件設(shè)計模式,至今已被廣泛使用。最近幾年被推薦為Sun公司J2EE平臺的設(shè)計模式,并且受到越來越多的使用 ColdFusion 和 PHP 的開發(fā)者的歡迎。模型-視圖-控制器模式是一個有用的工具箱,它有很多好處,但也有一些缺點(diǎn)。

      二、MVC如何工作

      MVC是一個設(shè)計模式,它強(qiáng)制性的使應(yīng)用程序的輸入、處理和輸出分開。使用MVC應(yīng)用程序被分成三個核心部件:模型、視圖、控制器。它們各自處理自己的任務(wù)。

      視圖

      視圖是用戶看到并與之交互的界面。對老式的Web應(yīng)用程序來說,視圖就是由HTML元素組成的界面,在新式的Web應(yīng)用程序中,HTML依舊在視圖中扮演著重要的角色,但一些新的技術(shù)已層出不窮,它們包括Macromedia Flash和象XHTML,XML/XSL,WML等一些標(biāo)識語言和Web services.

      如何處理應(yīng)用程序的界面變得越來越有挑戰(zhàn)性。MVC一個大的好處是它能為你的應(yīng)用程序處理很多不同的視圖。在視圖中其實(shí)沒有真正的處理發(fā)生,不管這些數(shù)據(jù)是聯(lián)機(jī)存儲的還是一個雇員列表,作為視圖來講,它只是作為一種輸出數(shù)據(jù)并允許用戶操縱的方式。

      模型

      模型表示企業(yè)數(shù)據(jù)和業(yè)務(wù)規(guī)則。在MVC的三個部件中,模型擁有最多的處理任務(wù)。例如它可能用象EJBs和ColdFusion Components這樣的構(gòu)件對象來處理數(shù)據(jù)庫。被模型返回的數(shù)據(jù)是中立的,就是說模型與數(shù)據(jù)格式無關(guān),這樣一個模型能為多個視圖提供數(shù)據(jù)。由于應(yīng)用于模型的代碼只需寫一次就可以被多個視圖重用,所以減少了代碼的重復(fù)性。

      控制器

      控制器接受用戶的輸入并調(diào)用模型和視圖去完成用戶的需求。所以當(dāng)單擊Web頁面中的超鏈接和發(fā)送HTML表單時,控制器本身不輸出任何東西和做任何處理。它只是接收請求并決定調(diào)用哪個模型構(gòu)件去處理請求,然后用確定用哪個視圖來顯示模型處理返回的數(shù)據(jù)。

      現(xiàn)在我們總結(jié)MVC的處理過程,首先控制器接收用戶的請求,并決定應(yīng)該調(diào)用哪個模型來進(jìn)行處理,然后模型用業(yè)務(wù)邏輯來處理用戶的請求并返回數(shù)據(jù),最后控制器用相應(yīng)的視圖格式化模型返回的數(shù)據(jù),并通過表示層呈現(xiàn)給用戶。

      三、為什么要使用 MVC

      大部分Web應(yīng)用程序都是用像ASP,PHP,或者CFML這樣的過程化語言來創(chuàng)建的。它們將像數(shù)據(jù)庫查詢語句這樣的數(shù)據(jù)層代碼和像HTML這樣的表示層代碼混在一起。經(jīng)驗(yàn)比較豐富的開發(fā)者會將數(shù)據(jù)從表示層分離開來,但這通常不是很容易做到的,它需要精心的計劃和不斷的嘗試。MVC從根本上強(qiáng)制性的將它們分開。盡管構(gòu)造MVC應(yīng)用程序需要一些額外的工作,但是它給我們帶來的好處是無庸質(zhì)疑的。

      首先,最重要的一點(diǎn)是多個視圖能共享一個模型,正如我所提及的,現(xiàn)在需要用越來越多的方式來訪問你的應(yīng)用程序。對此,其中一個解決之道是使用MVC,無論你的用戶想要Flash界面或是 WAP 界面;用一個模型就能處理它們。由于你已經(jīng)將數(shù)據(jù)和業(yè)務(wù)規(guī)則從表示層分開,所以你可以最大化的重用你的代碼了。

      由于模型返回的數(shù)據(jù)沒有進(jìn)行格式化,所以同樣的構(gòu)件能被不同界面使用。例如,很多數(shù)據(jù)可能用HTML來表示,但是它們也有可能要用Macromedia Flash和WAP來表示。模型也有狀態(tài)管理和數(shù)據(jù)持久性處理的功能,例如,基于會話的購物車和電子商務(wù)過程也能被Flash網(wǎng)站或者無線聯(lián)網(wǎng)的應(yīng)用程序所重用。

      因?yàn)槟P褪亲园模⑶遗c控制器和視圖相分離,所以很容易改變你的應(yīng)用程序的數(shù)據(jù)層和業(yè)務(wù)規(guī)則。如果你想把你的數(shù)據(jù)庫從MySQL移植到Oracle,或者改變你的基于RDBMS數(shù)據(jù)源到LDAP,只需改變你的模型即可。一旦你正確的實(shí)現(xiàn)了模型,不管你的數(shù)據(jù)來自數(shù)據(jù)庫或是LDAP服務(wù)器,視圖將會正確的顯示它們。由于運(yùn)用MVC的應(yīng)用程序的三個部件是相互對立,改變其中一個不會影響其它兩個,所以依據(jù)這種設(shè)計思想你能構(gòu)造良好的松偶合的構(gòu)件。

      對我來說,控制器的也提供了一個好處,就是可以使用控制器來聯(lián)接不同的模型和視圖去完成用戶的需求,這樣控制器可以為構(gòu)造應(yīng)用程序提供強(qiáng)有力的手段。給定一些可重用的模型和視圖,控制器可以根據(jù)用戶的需求選擇模型進(jìn)行處理,然后選擇視圖將處理結(jié)果顯示給用戶。

      四、MVC的缺點(diǎn)

      MVC的缺點(diǎn)是由于它沒有明確的定義,所以完全理解MVC并不是很容易。使用MVC需要精心的計劃,由于它的內(nèi)部原理比較復(fù)雜,所以需要花費(fèi)一些時間去思考。

      你將不得不花費(fèi)相當(dāng)可觀的時間去考慮如何將MVC運(yùn)用到你的應(yīng)用程序,同時由于模型和視圖要嚴(yán)格的分離,這樣也給調(diào)試應(yīng)用程序到來了一定的困難。每個構(gòu)件在使用之前都需要經(jīng)過徹底的測試。一旦你的構(gòu)件經(jīng)過了測試,你就可以毫無顧忌的重用它們了。

      根據(jù)我個人經(jīng)驗(yàn),由于我們將一個應(yīng)用程序分成了三個部件,所以使用MVC同時也意味著你將要管理比以前更多的文件,這一點(diǎn)是顯而易見的。這樣好像我們的工作量增加了,但是請記住這比起它所能帶給我們的好處是不值一提。

      MVC并不適合小型甚至中等規(guī)模的應(yīng)用程序,花費(fèi)大量時間將MVC應(yīng)用到規(guī)模并不是很大的應(yīng)用程序通常會得不償失。

      五、MVC優(yōu)點(diǎn):MVC是一條創(chuàng)建軟件的好途徑

      MVC設(shè)計模式是一個很好創(chuàng)建軟件的途徑,它所提倡的一些原則,像內(nèi)容和顯示互相分離可能比較好理解。但是如果你要隔離模型、視圖和控制器的構(gòu)件,你可能需要重新思考你的應(yīng)用程序,尤其是應(yīng)用程序的構(gòu)架方面。如果你肯接受MVC,并且有能力應(yīng)付它所帶來的額外的工作和復(fù)雜性,MVC將會使你的軟件在健壯性,代碼重用和結(jié)構(gòu)方面上一個新的臺階。

      希望對您有所幫助!~

      JAVA中為什么要實(shí)現(xiàn)線程和任務(wù)分離,分離好處的例子和不分離是怎么樣的?

      你好,我覺得你這個問題,不是問題,因?yàn)槿魏握Z言,線程和任務(wù)都是分離開來的,你可以理解成線程是個容器,任務(wù)在容器里工作,舉個宏觀的例子,你就是任務(wù),A公司是線程,你可以在A公司工作,當(dāng)然,你也可以跳槽去B公司工作,從未聽說過線程與任務(wù)的關(guān)系用“分離”這個詞來闡述,它倆本身就是分離的,我個人到時覺得把線程和任務(wù)變成不分離,那才是難點(diǎn)和問題點(diǎn)

      HTML代碼和JAVA代碼分離開

      那你得使用標(biāo)簽了,jstl標(biāo)簽可以的,還有就是如果你用到了jsf,jsf標(biāo)簽也可以幫你脫離標(biāo)簽,不過完全的分離有時候是不現(xiàn)實(shí)的,而且也很不方便。如果是小的項目,可以考慮完全脫離,這樣也可以鍛煉一下技術(shù),但是大項目里,頁面數(shù)據(jù)特別多的話,完全分離就不現(xiàn)實(shí)了。

      具體標(biāo)簽怎么使用,我這里就不細(xì)說了,你可以百度一下。

      個人意見,希望對你有用。

      在java中,異常處理的機(jī)制有哪幾種,分別是什么

      1 引子

      try…catch…finally恐怕是大家再熟悉不過的語句了,而且感覺用起來也是很簡單,邏輯上似乎也是很容易理解。不過,我親自體驗(yàn)的“教訓(xùn)”告訴我,這個東西可不是想象中的那么簡單、聽話。不信?那你看看下面的代碼,“猜猜”它執(zhí)行后的結(jié)果會是什么?不要往后看答案、也不許執(zhí)行代碼看真正答案哦。如果你的答案是正確,那么這篇文章你就不用浪費(fèi)時間看啦。

      package myExample.testException;

      public class TestException {

      public TestException() {

      }

      boolean testEx() throws Exception{

      boolean ret = true;

      try{

      ret = testEx1();

      }catch (Exception e){

      System.out.println("testEx, catch exception");

      ret = false;

      throw e;

      }finally{

      System.out.println("testEx, finally; return value="+ret);

      return ret;

      }

      }

      boolean testEx1() throws Exception{

      boolean ret = true;

      try{

      ret = testEx2();

      if (!ret){

      return false;

      }

      System.out.println("testEx1, at the end of try");

      return ret;

      }catch (Exception e){

      System.out.println("testEx1, catch exception");

      ret = false;

      throw e;

      }

      finally{

      System.out.println("testEx1, finally; return value="+ret);

      return ret;

      }

      }

      boolean testEx2() throws Exception{

      boolean ret = true;

      try{

      int b=12;

      int c;

      for (int i=2;i=-2;i--){

      c=b/i;

      System.out.println("i="+i);

      }

      return true;

      }catch (Exception e){

      System.out.println("testEx2, catch exception");

      ret = false;

      throw e;

      }

      finally{

      System.out.println("testEx2, finally; return value="+ret);

      return ret;

      }

      }

      public static void main(String[] args) {

      TestException testException1 = new TestException();

      try{

      testException1.testEx();

      }catch(Exception e){

      e.printStackTrace();

      }

      }

      }

      你的答案是什么?是下面的答案嗎?

      i=2

      i=1

      testEx2, catch exception

      testEx2, finally; return value=false

      testEx1, catch exception

      testEx1, finally; return value=false

      testEx, catch exception

      testEx, finally; return value=false

      如果你的答案真的如上面所說,那么你錯啦。^_^,那就建議你仔細(xì)看一看這篇文章或者拿上面的代碼按各種不同的情況修改、執(zhí)行、測試,你會發(fā)現(xiàn)有很多事情不是原來想象中的那么簡單的。

      現(xiàn)在公布正確答案:

      i=2

      i=1

      testEx2, catch exception

      testEx2, finally; return value=false

      testEx1, finally; return value=false

      testEx, finally; return value=false

      2 基礎(chǔ)知識

      2.1 相關(guān)概念

      例外是在程序運(yùn)行過程中發(fā)生的異常事件,比如除0溢出、數(shù)組越界、文件找不到等,這些事件的發(fā)生將阻止程序的正常運(yùn)行。為了加強(qiáng)程序的魯棒性,程序設(shè)計時,必須考慮到可能發(fā)生的異常事件并做出相應(yīng)的處理。C語言中,通過使用if語句來判斷是否出現(xiàn)了例外,同時,調(diào)用函數(shù)通過被調(diào)用函數(shù)的返回值感知在被調(diào)用函數(shù)中產(chǎn)生的例外事件并進(jìn)行處理。全程變量ErroNo常常用來反映一個異常事件的類型。但是,這種錯誤處理機(jī)制會導(dǎo)致不少問題。

      Java通過面向?qū)ο蟮姆椒▉硖幚砝狻T谝粋€方法的運(yùn)行過程中,如果發(fā)生了例外,則這個方法生成代表該例外的一個對象,并把它交給運(yùn)行時系統(tǒng),運(yùn)行時系統(tǒng)尋找相應(yīng)的代碼來處理這一例外。我們把生成例外對象并把它提交給運(yùn)行時系統(tǒng)的過程稱為拋棄(throw)一個例外。運(yùn)行時系統(tǒng)在方法的調(diào)用棧中查找,從生成例外的方法開始進(jìn)行回朔,直到找到包含相應(yīng)例外處理的方法為止,這一個過程稱為捕獲(catch)一個例外。

      2.2 Throwable類及其子類

      用面向?qū)ο蟮姆椒ㄌ幚砝猓捅仨毥㈩惖膶哟巍n?Throwable位于這一類層次的最頂層,只有它的后代才可以做為一個例外被拋棄。圖1表示了例外處理的類層次。

      從圖中可以看出,類Throwable有兩個直接子類:Error和Exception。Error類對象(如動態(tài)連接錯誤等),由Java虛擬機(jī)生成并拋棄(通常,Java程序不對這類例外進(jìn)行處理);Exception類對象是Java程序處理或拋棄的對象。它有各種不同的子類分別對應(yīng)于不同類型的例外。其中類RuntimeException代表運(yùn)行時由Java虛擬機(jī)生成的例外,如算術(shù)運(yùn)算例外ArithmeticException(由除0錯等導(dǎo)致)、數(shù)組越界例外ArrayIndexOutOfBoundsException等;其它則為非運(yùn)行時例外,如輸入輸出例外IOException等。Java編譯器要求Java程序必須捕獲或聲明所有的非運(yùn)行時例外,但對運(yùn)行時例外可以不做處理。

      圖1 例外處理的類層次

      2.3 異常處理關(guān)鍵字

      Java的異常處理是通過5個關(guān)鍵字來實(shí)現(xiàn)的:try,catch,throw,throws,finally。JB的在線幫助中對這幾個關(guān)鍵字是這樣解釋的:

      Throws: Lists the exceptions a method could throw.

      Throw: Transfers control of the method to the exception handler.

      Try: Opening exception-handling statement.

      Catch: Captures the exception.

      Finally: Runs its code before terminating the program.

      2.3.1 try語句

      try語句用大括號{}指定了一段代碼,該段代碼可能會拋棄一個或多個例外。

      2.3.2 catch語句

      catch語句的參數(shù)類似于方法的聲明,包括一個例外類型和一個例外對象。例外類型必須為Throwable類的子類,它指明了catch語句所處理的例外類型,例外對象則由運(yùn)行時系統(tǒng)在try所指定的代碼塊中生成并被捕獲,大括號中包含對象的處理,其中可以調(diào)用對象的方法。

      catch語句可以有多個,分別處理不同類的例外。Java運(yùn)行時系統(tǒng)從上到下分別對每個catch語句處理的例外類型進(jìn)行檢測,直到找到類型相匹配的catch語句為止。這里,類型匹配指catch所處理的例外類型與生成的例外對象的類型完全一致或者是它的父類,因此,catch語句的排列順序應(yīng)該是從特殊到一般。

      也可以用一個catch語句處理多個例外類型,這時它的例外類型參數(shù)應(yīng)該是這多個例外類型的父類,程序設(shè)計中要根據(jù)具體的情況來選擇catch語句的例外處理類型。

      2.3.3 finally語句

      try所限定的代碼中,當(dāng)拋棄一個例外時,其后的代碼不會被執(zhí)行。通過finally語句可以指定一塊代碼。無論try所指定的程序塊中拋棄或不拋棄例外,也無論catch語句的例外類型是否與所拋棄的例外的類型一致,finally所指定的代碼都要被執(zhí)行,它提供了統(tǒng)一的出口。通常在finally語句中可以進(jìn)行資源的清除工作。如關(guān)閉打開的文件等。

      2.3.4 throws語句

      throws總是出現(xiàn)在一個函數(shù)頭中,用來標(biāo)明該成員函數(shù)可能拋出的各種異常。對大多數(shù)Exception子類來說,Java 編譯器會強(qiáng)迫你聲明在一個成員函數(shù)中拋出的異常的類型。如果異常的類型是Error或 RuntimeException, 或它們的子類,這個規(guī)則不起作用, 因?yàn)檫@在程序的正常部分中是不期待出現(xiàn)的。 如果你想明確地拋出一個RuntimeException,你必須用throws語句來聲明它的類型。

      2.3.5 throw語句

      throw總是出現(xiàn)在函數(shù)體中,用來拋出一個異常。程序會在throw語句后立即終止,它后面的語句執(zhí)行不到,然后在包含它的所有try塊中(可能在上層調(diào)用函數(shù)中)從里向外尋找含有與其匹配的catch子句的try塊。

      3 關(guān)鍵字及其中語句流程詳解

      3.1 try的嵌套

      你可以在一個成員函數(shù)調(diào)用的外面寫一個try語句,在這個成員函數(shù)內(nèi)部,寫另一個try語句保護(hù)其他代碼。每當(dāng)遇到一個try語句,異常的框架就放到堆棧上面,直到所有的try語句都完成。如果下一級的try語句沒有對某種異常進(jìn)行處理,堆棧就會展開,直到遇到有處理這種異常的try語句。下面是一個try語句嵌套的例子。

      class MultiNest {

      static void procedure() {

      try {

      int a = 0;

      int b = 42/a;

      } catch(java.lang.ArithmeticException e) {

      System.out.println("in procedure, catch ArithmeticException: " + e);

      }

      }

      public static void main(String args[]) {

      try {

      procedure();

      } catch(java.lang. Exception e) {

      System.out.println("in main, catch Exception: " + e);

      }

      }

      }

      這個例子執(zhí)行的結(jié)果為:

      in procedure, catch ArithmeticException: java.lang.ArithmeticException: / by zero

      成員函數(shù)procedure里有自己的try/catch控制,所以main不用去處理 ArrayIndexOutOfBoundsException;當(dāng)然如果如同最開始我們做測試的例子一樣,在procedure中catch到異常時使用throw e;語句將異常拋出,那么main當(dāng)然還是能夠捕捉并處理這個procedure拋出來的異常。例如在procedure函數(shù)的catch中的System.out語句后面增加throw e;語句之后,執(zhí)行結(jié)果就變?yōu)椋?/p>

      in procedure, catch ArithmeticException: java.lang.ArithmeticException: / by zero

      in main, catch Exception: java.lang.ArithmeticException: / by zero

      3.2 try-catch程序塊的執(zhí)行流程以及執(zhí)行結(jié)果

      相對于try-catch-finally程序塊而言,try-catch的執(zhí)行流程以及執(zhí)行結(jié)果還是比較簡單的。

      首先執(zhí)行的是try語句塊中的語句,這時可能會有以下三種情況:

      1. 如果try塊中所有語句正常執(zhí)行完畢,那么就不會有其他的“動做”被執(zhí)行,整個try-catch程序塊正常完成。

      2. 如果try語句塊在執(zhí)行過程中碰到異常V,這時又分為兩種情況進(jìn)行處理:

      2 如果異常V能夠被與try相應(yīng)的catch塊catch到,那么第一個catch到這個異常的catch塊(也是離try最近的一個與異常V匹配的catch塊)將被執(zhí)行;如果catch塊執(zhí)行正常,那么try-catch程序塊的結(jié)果就是“正常完成”;如果該catch塊由于原因R突然中止,那么try-catch程序塊的結(jié)果就是“由于原因R突然中止(completes abruptly)”。

      2 如果異常V沒有catch塊與之匹配,那么這個try-catch程序塊的結(jié)果就是“由于拋出異常V而突然中止(completes abruptly)”。

      3. 如果try由于其他原因R突然中止(completes abruptly),那么這個try-catch程序塊的結(jié)果就是“由于原因R突然中止(completes abruptly)”。

      3.3 try-catch-finally程序塊的執(zhí)行流程以及執(zhí)行結(jié)果

      try-catch-finally程序塊的執(zhí)行流程以及執(zhí)行結(jié)果比較復(fù)雜。

      首先執(zhí)行的是try語句塊中的語句,這時可能會有以下三種情況:

      1. 如果try塊中所有語句正常執(zhí)行完畢,那么finally塊的居于就會被執(zhí)行,這時分為以下兩種情況:

      2 如果finally塊執(zhí)行順利,那么整個try-catch-finally程序塊正常完成。

      2 如果finally塊由于原因R突然中止,那么try-catch-finally程序塊的結(jié)局是“由于原因R突然中止(completes abruptly)”

      2. 如果try語句塊在執(zhí)行過程中碰到異常V,這時又分為兩種情況進(jìn)行處理:

      2 如果異常V能夠被與try相應(yīng)的catch塊catch到,那么第一個catch到這個異常的catch塊(也是離try最近的一個與異常V匹配的catch塊)將被執(zhí)行;這時就會有兩種執(zhí)行結(jié)果:

      2 如果catch塊執(zhí)行正常,那么finally塊將會被執(zhí)行,這時分為兩種情況:

      2 如果finally塊執(zhí)行順利,那么整個try-catch-finally程序塊正常完成。

      2 如果finally塊由于原因R突然中止,那么try-catch-finally程序塊的結(jié)局是“由于原因R突然中止(completes abruptly)”

      2 如果catch塊由于原因R突然中止,那么finally模塊將被執(zhí)行,分為兩種情況:

      2 如果如果finally塊執(zhí)行順利,那么整個try-catch-finally程序塊的結(jié)局是“由于原因R突然中止(completes abruptly)”。

      2 如果finally塊由于原因S突然中止,那么整個try-catch-finally程序塊的結(jié)局是“由于原因S突然中止(completes abruptly)”,原因R將被拋棄。

      (注意,這里就正好和我們的例子相符合,雖然我們在testEx2中使用throw e拋出了異常,但是由于testEx2中有finally塊,而finally塊的執(zhí)行結(jié)果是complete abruptly的(別小看這個用得最多的return,它也是一種導(dǎo)致complete abruptly的原因之一啊——后文中有關(guān)于導(dǎo)致complete abruptly的原因分析),所以整個try-catch-finally程序塊的結(jié)果是“complete abruptly”,所以在testEx1中調(diào)用testEx2時是捕捉不到testEx1中拋出的那個異常的,而只能將finally中的return結(jié)果獲取到。

      如果在你的代碼中期望通過捕捉被調(diào)用的下級函數(shù)的異常來給定返回值,那么一定要注意你所調(diào)用的下級函數(shù)中的finally語句,它有可能會使你throw出來的異常并不能真正被上級調(diào)用函數(shù)可見的。當(dāng)然這種情況是可以避免的,以testEx2為例:如果你一定要使用finally而且又要將catch中throw的e在testEx1中被捕獲到,那么你去掉testEx2中的finally中的return就可以了。

      這個事情已經(jīng)在OMC2.0的MIB中出現(xiàn)過啦:服務(wù)器的異常不能完全被反饋到客戶端。)

      2 如果異常V沒有catch塊與之匹配,那么finally模塊將被執(zhí)行,分為兩種情況:

      2 如果finally塊執(zhí)行順利,那么整個try-catch-finally程序塊的結(jié)局就是“由于拋出異常V而突然中止(completes abruptly)”。

      2 如果finally塊由于原因S突然中止,那么整個try-catch-finally程序塊的結(jié)局是“由于原因S突然中止(completes abruptly)”,異常V將被拋棄。

      3. 如果try由于其他原因R突然中止(completes abruptly),那么finally塊被執(zhí)行,分為兩種情況:

      2 如果finally塊執(zhí)行順利,那么整個try-catch-finally程序塊的結(jié)局是“由于原因R突然中止(completes abruptly)”。

      2 如果finally塊由于原因S突然中止,那么整個try-catch-finally程序塊的結(jié)局是“由于原因S突然中止(completes abruptly)”,原因R將被拋棄。

      3.4 try-catch-finally程序塊中的return

      從上面的try-catch-finally程序塊的執(zhí)行流程以及執(zhí)行結(jié)果一節(jié)中可以看出無論try或catch中發(fā)生了什么情況,finally都是會被執(zhí)行的,那么寫在try或者catch中的return語句也就不會真正的從該函數(shù)中跳出了,它的作用在這種情況下就變成了將控制權(quán)(語句流程)轉(zhuǎn)到finally塊中;這種情況下一定要注意返回值的處理。

      例如,在try或者catch中return false了,而在finally中又return true,那么這種情況下不要期待你的try或者catch中的return false的返回值false被上級調(diào)用函數(shù)獲取到,上級調(diào)用函數(shù)能夠獲取到的只是finally中的返回值,因?yàn)閠ry或者catch中的return語句只是轉(zhuǎn)移控制權(quán)的作用。

      3.5 如何拋出異常

      如果你知道你寫的某個函數(shù)有可能拋出異常,而你又不想在這個函數(shù)中對異常進(jìn)行處理,只是想把它拋出去讓調(diào)用這個函數(shù)的上級調(diào)用函數(shù)進(jìn)行處理,那么有兩種方式可供選擇:

      第一種方式:直接在函數(shù)頭中throws SomeException,函數(shù)體中不需要try/catch。比如將最開始的例子中的testEx2改為下面的方式,那么testEx1就能捕捉到testEx2拋出的異常了。

      boolean testEx2() throws Exception{

      boolean ret = true;

      int b=12;

      int c;

      for (int i=2;i=-2;i--){

      c=b/i;

      System.out.println("i="+i);

      }

      return true;

      }

      第二種方式:使用try/catch,在catch中進(jìn)行一定的處理之后(如果有必要的話)拋出某種異常。例如上面的testEx2改為下面的方式,testEx1也能捕獲到它拋出的異常:

      boolean testEx2() throws Exception{

      boolean ret = true;

      try{

      int b=12;

      int c;

      for (int i=2;i=-2;i--){

      c=b/i;

      System.out.println("i="+i);

      }

      return true;

      }catch (Exception e){

      System.out.println("testEx2, catch exception");

      Throw e;

      }

      }

      第三種方法:使用try/catch/finally,在catch中進(jìn)行一定的處理之后(如果有必要的話)拋出某種異常。例如上面的testEx2改為下面的方式,testEx1也能捕獲到它拋出的異常:

      boolean testEx2() throws Exception{

      boolean ret = true;

      try{

      int b=12;

      int c;

      for (int i=2;i=-2;i--){

      c=b/i;

      System.out.println("i="+i);

      throw new Exception("aaa");

      }

      return true;

      }catch (java.lang.ArithmeticException e){

      System.out.println("testEx2, catch exception");

      ret = false;

      throw new Exception("aaa");

      }finally{

      System.out.println("testEx2, finally; return value="+ret);

      }

      }

      4 關(guān)于abrupt completion

      前面提到了complete abruptly(暫且理解為“突然中止”或者“異常結(jié)束”吧),它主要包含了兩種大的情形:abrupt completion of expressions and statements,下面就分兩種情況進(jìn)行解釋。

      4.1 Normal and Abrupt Completion of Evaluation

      每一個表達(dá)式(expression)都有一種使得其包含的計算得以一步步進(jìn)行的正常模式,如果每一步計算都被執(zhí)行且沒有異常拋出,那么就稱這個表達(dá)式“正常結(jié)束(complete normally)”;如果這個表達(dá)式的計算拋出了異常,就稱為“異常結(jié)束(complete abruptly)”。異常結(jié)束通常有一個相關(guān)聯(lián)的原因(associated reason),通常也就是拋出一個異常V。

      與表達(dá)式、操作符相關(guān)的運(yùn)行期異常有:

      2 A class instance creation expression, array creation expression , or string concatenation operatior expression throws an OutOfMemoryError if there is insufficient memory available.

      2 An array creation expression throws a NegativeArraySizeException if the value of any dimension expression is less than zero.

      2 A field access throws a NullPointerException if the value of the object reference expression is null.

      2 A method invocation expression that invokes an instance method throws a NullPointerException if the target reference is null.

      2 An array access throws a NullPointerException if the value of the array reference expression is null.

      2 An array access throws an ArrayIndexOutOfBoundsException if the value of the array index expression is negative or greater than or equal to the length of the array.

      2 A cast throws a ClassCastException if a cast is found to be impermissible at run time.

      2 An integer division or integer remainder operator throws an ArithmeticException if the value of the right-hand operand expression is zero.

      2 An assignment to an array component of reference type throws an ArrayStoreException when the value to be assigned is not compatible with the component type of the array.

      4.2 Normal and Abrupt Completion of Statements

      正常情況我們就不多說了,在這里主要是列出了abrupt completion的幾種情況:

      2 break, continue, and return 語句將導(dǎo)致控制權(quán)的轉(zhuǎn)換,從而使得statements不能正常地、完整地執(zhí)行。

      2 某些表達(dá)式的計算也可能從java虛擬機(jī)拋出異常,這些表達(dá)式在上一小節(jié)中已經(jīng)總結(jié)過了;一個顯式的的throw語句也將導(dǎo)致異常的拋出。拋出異常也是導(dǎo)致控制權(quán)的轉(zhuǎn)換的原因(或者說是阻止statement正常結(jié)束的原因)。

      如果上述事件發(fā)生了,那么這些statement就有可能使得其正常情況下應(yīng)該都執(zhí)行的語句不能完全被執(zhí)行到,那么這些statement也就是被稱為是complete abruptly.

      導(dǎo)致abrupt completion的幾種原因:

      2 A break with no label

      2 A break with a given label

      2 A continue with no label

      2 A continue with a given label

      2 A return with no value

      2 A return with a given value A

      2 throw with a given value, including exceptions thrown by the Java virtual machine

      5 關(guān)于我們的編程的一點(diǎn)建議

      弄清楚try-catch-finally的執(zhí)行情況后我們才能正確使用它。

      如果我們使用的是try-catch-finally語句塊,而我們又需要保證有異常時能夠拋出異常,那么在finally語句中就不要使用return語句了(finally語句塊的最重要的作用應(yīng)該是釋放申請的資源),因?yàn)閒inally中的return語句會導(dǎo)致我們的throw e被拋棄,在這個try-catch-finally的外面將只能看到finally中的返回值(除非在finally中拋出異常)。(我們需要記住:不僅throw語句是abrupt completion 的原因,return、break、continue等這些看起來很正常的語句也是導(dǎo)致abrupt completion的原因。)


      當(dāng)前名稱:java中代碼分離的好處 java中代碼分離的好處有哪些
      路徑分享:http://www.ef60e0e.cn/article/hgjosc.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        杭州市| 哈尔滨市| 德格县| 璧山县| 锡林郭勒盟| 英吉沙县| 融水| 从江县| 论坛| 漳浦县| 楚雄市| 上高县| 鹤岗市| 灌南县| 西华县| 肇东市| 莫力| 安丘市| 桦甸市| 察雅县| 资中县| 河西区| 澄迈县| 南康市| 通渭县| 高唐县| 阳江市| 阆中市| 临夏县| 台南县| 鱼台县| 上林县| 筠连县| 平遥县| 江门市| 聂拉木县| 赣州市| 邹城市| 承德县| 烟台市| 新邵县|