<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    拾貝殼

    走過的路
    隨筆 - 39, 文章 - 1, 評論 - 14, 引用 - 0
    數(shù)據(jù)加載中……

    JUDE還是很好用的

    ?? 沒有華麗的Rose,也沒有Togather,用JUDE的感覺也不錯.剛剛把PicoContainer反向了.可惜,好東西都陸續(xù)要收費了.只能用用Community /Free 版.
    ?
    JUDE的一個下載地址:
    ?? http://jude.change-vision.com/jude-web/product/community.html

    posted @ 2006-07-23 15:27 binge 閱讀(896) | 評論 (1)編輯 收藏

    PicoContainer源碼導(dǎo)讀

         摘要: 一、簡介?? 感謝“簡易java框架”分享的學(xué)習(xí)心得。循著他的足跡,我把picocontainer讀了一遍。源代碼的版本是1.2-RC-2。?? pico的官方站點:http://www.picocontainer.org/?? 由于它是一個專門的ioc容器,所以使用起來沒有spring那么麻煩。關(guān)于他的文檔,在官方站點上有一篇《5分鐘搞定pico》的文章。國人似乎也有很多的翻譯版本。講解得很詳細...  閱讀全文

    posted @ 2006-07-23 14:30 binge 閱讀(3017) | 評論 (0)編輯 收藏

    一個簡單的ThreadPool分析

    一個簡單的ThreadPool
    ? 原文來自http://www.informit.com/articles/printerfriendly.asp?p=30483&r1=1&rl=1
    ? 項目是多線程的,所以引入了線程池這個東西。池子是個老美寫的。在項目中表現(xiàn)的還不錯。所以把它摘出來,介紹給以后或許需要用到它的同行們。
    ? 關(guān)于為什么要采用ThreadPool,原文已經(jīng)提到了:創(chuàng)建一個線程是需要開銷的;如果線程數(shù)量過大的話,cpu就會浪費很大的精力做線程切換。
    ? ThreadPool的實現(xiàn)過程就是對WorkerThread的同步和通信的管理過程。
    ? 我們來看代碼。
    ? 首先,在ThreadPool構(gòu)造的時候,創(chuàng)建10個WorkerThread(size=10)并讓他們運行。每個WorkerThread線程都有個ThreadPool的引用,用于查詢ThreadPool的狀態(tài)和獲得同步鎖.WorkerThread運行以后,循環(huán)調(diào)用ThreadPool的方法進行查詢,如果沒有發(fā)現(xiàn)任務(wù),ThreadPool告訴正在查詢的線程進入休眠狀態(tài),WorkerThread釋放對查詢方法的鎖定.這樣在還沒有任務(wù)的時候,所有的10個WorkerThread都會進入休眠狀態(tài),進入等待ThreadPool對象的等待鎖定池,只有ThreadPool對象發(fā)出notify方法(或notifyAll)后WorkerThread線程才進入對象鎖定池準備獲得對象鎖進入運行狀態(tài)。
    代碼片斷:
    while ( !assignments.iterator().hasNext() )
    ??? wait();
    如果你有jprofile或者其他的觀察線程的工具,你可以看到有10個線程都在休眠狀態(tài).
    ? 接著,我們向ThreadPool中加入任務(wù),這些任務(wù)都實現(xiàn)了Runnable的run方法.(至于為什么把任務(wù)都做成Runnable,譯者至今也有些疑問?預(yù)定俗成?TimerTask也是實現(xiàn)自Runnable,弄得初學(xué)者經(jīng)常把真正運行的線程搞混).ThreadPool每assign一個任務(wù),就會發(fā)出一條消息,通知它的等待鎖定池中的線程.各個線程以搶占的方式獲得對象鎖,然后很順利的獲得一條任務(wù).并把此任務(wù)從ThreadPool里面刪除.沒有搶到的繼續(xù)等待.
    Runnable r = (Runnable)assignments.iterator().next();
    ?? assignments.remove(r);
    WorkerThread從ThreadPool那里獲得了任務(wù),繼續(xù)向下執(zhí)行。
    target = owner.getAssignment();
    ?? if (target!=null) {
    ??? target.run();?????
    ??? owner.done.workerEnd();
    ?? }
    記住,這里調(diào)用的是target.run();而不是調(diào)用的線程的start()方法。也就是說在這里表現(xiàn)出的WorkerThread和task之間的關(guān)系僅僅是簡單的方法調(diào)用的關(guān)系,并沒有額外產(chǎn)生新線程。(這就是我上面納悶為什么大家都實現(xiàn)Runnable來做task的原因)
    ?大家可能注意到,WorkerThread并沒有對異常作處理。而我們知道發(fā)生在線程上的異常會導(dǎo)致線程死亡。解決的辦法有2中,一種是通過threadpool的管理來重新激起一個線程,一種是把異常在線程之內(nèi)消滅。在項目中,我采用的是第二中,因此這個片斷改稱這樣:
    if (target!=null) {
    ? try{
    ??? target.run();?????
    ?? }
    ? catch(Throwable t){
    ?.......
    ?? }
    ??? owner.done.workerEnd();
    }
    在WorkerThread完成一個task以后,繼續(xù)循環(huán)作同樣的流程.
    在這個ThreadPool的實現(xiàn)里面,Jeff Heaton用了一個Done類來觀察WorkerThread的執(zhí)行情況.和ThreadPoool的等待鎖定池不同,Done的等待鎖定池里面放的是初始化ThreadPool的線程(可能是你的主線程),我們叫他母線程.
    ? 在給出的測試例子中.母線程在調(diào)用complete()方法后進入休眠(在監(jiān)視中等待),一開始是waitBegin()讓他休眠,在assign加入task以后,waitDone()方法讓他休眠.在WorkerThread完成一個task以后,通知waitDone()起來重新檢查activeThreads的數(shù)值.若不為0,繼續(xù)睡覺.若為0,那么母線程走完,死亡(這個時候該做的task已經(jīng)做完了).母線程走完,ThreadPool還存在嗎?答案是存在,因為WorkerThread還沒有消亡,他們在等待下一批任務(wù),他們有ThreadPool的引用,保證ThreadPool依然存在.大家或許已經(jīng)明白Done這個類的作用了.
    ? 細心的讀者或許會發(fā)現(xiàn),發(fā)生在Done實例上的notify()并不是像ThreadPool上的notify()那樣每次都能完成一項工作.比如除了第一個被assign的task,其他的task在assign進去的時候,發(fā)出的notify()對于waitDone()來說是句"狼來了".
    ?最后在ThreadPool需要被清理得時候,使每一個WorkerThread中斷(這個時候或許所有的WorkerThread都在休眠)并銷毀.記住這里也是一個異步的過程.等到每一個WorkerThread都已經(jīng)銷毀,finalize()的方法體走完.ThreadPool被銷毀.
    ?for (int i=0;i<threads.length;i++) {
    ?? threads[i].interrupt();
    ?? done.workerBegin();
    ?? threads[i].destroy();
    ? }
    ? done.waitDone();
    為什么有句done.workerBegin();?不明白.
    參考文章:
    http://www.zdnet.com.cn/developer/common/printfriend/printfriendly.htm?AT=39276905-3800066897t-20000560c

    posted @ 2006-07-16 20:07 binge 閱讀(7186) | 評論 (1)編輯 收藏

    關(guān)于作者

    ??? 呂華兵,男,24歲。
    ??? 2000-2004年,在中國民航大學(xué)讀書。學(xué)習(xí)期間,筆者以技術(shù)部長身份參與了校易航工作室暨易航網(wǎng)站的創(chuàng)建和發(fā)展工作,參與和獨立完成了多個項目的設(shè)計和開發(fā)。
    ?? 2004年5月到2006年5月,在北京環(huán)亞時代(港新合資)天津軟件中心從事Java的開發(fā)工作。參與了CMCC的OA的實施工作,主力開發(fā)了MOCHA AM的前端顯示和MOCHA ITAM的報表系統(tǒng)。
    ? 2006年5月至今,在美國易達軟件有限公司工作。設(shè)計并開發(fā)了Information Publisher的多線程后端程序。
    ??
    ? 筆者長期從事j2se,j2ee的開發(fā)工作,對各種設(shè)計模式亦有豐富的使用經(jīng)驗。
    ? 筆者從來重視規(guī)范的軟件流程,對RUP有很深的理解。
    ? 對于javascript,dhtml,ajax,筆者有著豐富的經(jīng)驗。
    ? 筆者也是“拿來主義”的擁躉,不遺余力的翻譯、學(xué)習(xí)、使用和宣傳各種開源項目。目前使用過的開源項目有:spring、picocontainer、hibernate、ibatis、struts、webwork等框架系列,DOM系列,commons系列,Quartz,log4j,ant,oscache,proxool以及各種報表工具等等。

    ?筆者從來重視知識的提取和積累,這也是筆者開此blog的主要原因,同時,也希望通過此blog結(jié)交更多的朋友。

    posted @ 2006-07-16 10:15 binge 閱讀(416) | 評論 (0)編輯 收藏

    關(guān)于GWT的第一手經(jīng)驗

    譯者安:你敢大膽采用最新的技術(shù)嗎?你顧慮哪些方面?下面的采訪將給我們提供一個參考。
    ?原文:
    ? ?? 在java中,對技術(shù)的采用是一件讓人心煩的事情,因為我們獲得通知的途徑太多。不同的會議,不同的站點如slashdot和theserverside,而且還有數(shù)不清的個人博客如dhh和o'Reilly's Radar.
    一個讓人感興趣的技術(shù)總是讓業(yè)界議論紛紛,正如人們所意識到的,這個產(chǎn)品并不是成熟期。
    ??? 為了讓一個產(chǎn)品成為主流,早期的采用者必須足夠喜歡這項產(chǎn)品來承擔(dān)很多非常的任務(wù)以便
    讓更為膽怯的開發(fā)者相信這項新技術(shù)值得采用。像Hibernate和Spring Framework這樣的技術(shù)花了好幾年
    才成為一個成熟產(chǎn)品。許多產(chǎn)品,比如maven,在版本確定之前經(jīng)歷了痛苦的時期因為他們早期缺乏
    足夠的文檔或者有不同的足夠強大的挑戰(zhàn)者比如ant.本人對這個過程中的盲點很感興趣,從議論這個產(chǎn)品的介紹到大范圍的采用往往要經(jīng)歷成月上年,而且很難指定時間表。hibernate并不是暴雨似的到來,而是通過大量用戶自我采用.一個失敗的項目比如ojb出來的時候也是引起轟動,但是它最終沒有承諾的那么好.在這種情況下,早期的hibernate使用者其實信心不足.
    ? 讓我們來看Google Web Toolkit (GWT)…
    GWT在這個進程中處于什么位置?
    gwt看起來是在早期使用(early-adopter)的中期。一開始的議論聲已經(jīng)消去,現(xiàn)在陸續(xù)出現(xiàn)了許多關(guān)于gwt的文章和博客,表明了人們正在期待關(guān)于gwt的第一個helloworld的反饋報告。我的很多謹慎的同行都在回避他,事實上認為它是個不好的主意。風(fēng)險阻礙了開發(fā)者對大多數(shù)新技術(shù)的評估直到他們在現(xiàn)實中看到了一個活生生的實例解決方案--就像maven被ibm使用一樣。那些有能力來嘗試風(fēng)險的開發(fā)者正在對這個框架進行測試。他們中的某一個或許宣稱gwt不適合它的組織。另外一個同行已經(jīng)原則上接受了gwt的觀點,但是沒有時間來在他的應(yīng)用中集成。所以,到底gwt處于什么時期?早期的使用人群有哪些經(jīng)驗?zāi)兀?br />?? 關(guān)于這個問題,我專門采訪了Grassroots Technologies公司的Michael Podrazik。Grassroots Technologies是一個在紐約的咨詢小組。通過在Grassroots的工作,michael已經(jīng)正在把gwt應(yīng)用在他們的一個新的正在開發(fā)的web應(yīng)用當(dāng)中。在下面的采訪里面,我要求他來交流他的產(chǎn)品經(jīng)驗來幫助其他人去理解gwt.我特別要求他給一些gwt客觀的意見,而且細致的描述他在用gwt開發(fā)過程中遇到的挑戰(zhàn)。幸運的是,他的信息將會幫助你決定是否gwt是你項目的正確選擇。
    采訪內(nèi)容:
    q:什么使你選擇了gwt?
    a:我訂閱了google的blog,所以我聽說了gwt當(dāng)他發(fā)布到j(luò)avaone的時候。在閱讀了他的文檔之后我開始對這種方式很好奇,因此我把它down了下來而且開始使用它(play with it).我剛剛開始了一個項目,這個項目是把遺留的 Access/VBA的桌面應(yīng)用升級為一個web應(yīng)用。在UI方面有許多ajaxian特性所以我想我可以讓gwt一展身手。我認為(figure)只要我保持我的架構(gòu)足夠抽象,我就有能力用更為傳統(tǒng)的web應(yīng)用框架來替換gwt層。gwt會很傷腦筋嗎?至少目前為止我很開心。
    q:gwt出現(xiàn)了那些挑戰(zhàn)?你圍繞著gwt設(shè)計的web框架嗎?gwt是否挑戰(zhàn)了你關(guān)于web應(yīng)用開發(fā)的觀點?
    a:你確實不能簡單的認為gwt是一個webapp的框架,他更是一個有著rpc和對象序列化的ui類庫。因為你需要改變你項目組織的assumptions以及包的結(jié)構(gòu)。在java服務(wù)端開發(fā)rich-client用戶界面我們有大量的經(jīng)驗,比如flash/actionscript.gwt和他們十分類似,因此可以想象有這些元素的項目--分隔的服務(wù)端和客戶端而不是同一的webapp--很爽。
    ? 朝著這個方向,你需要明確區(qū)分服務(wù)端和客戶端的功能。我相信一個好的哲學(xué)就是使你的客戶端僅僅用于展示。
    ? 你需要思考你服務(wù)接口的設(shè)計,比如每個操作的粒度
    ? 你不能在客戶端代碼上用java5得語法
    Q:你的意思是不能再gwt的具體類或者普通的web應(yīng)用里面用java5的語法?
    a:你不能在客戶代碼里面使用java5的語法。我們在服務(wù)端代碼中使用了許多java5的特性,但是所有將要被轉(zhuǎn)換成javascript的代碼必須是1.4的規(guī)范。
    這個也包括許多事實上你用在服務(wù)端的類。因為rpc框架允許用戶定義的數(shù)據(jù)類型的序列化,意思是你將在瀏覽器端得到一個已經(jīng)被轉(zhuǎn)化為javascript實例的類,這個類作為一個參數(shù)傳遞到服務(wù)端的實現(xiàn)中。在你的服務(wù)端代碼中,你將操縱同一個class而且是編譯過的字節(jié)碼。
    ?這個時候就出現(xiàn)了一個選擇,domain module和gwt的耦合度怎樣才合適呢?
    What we decided was to keep value objects implementation-agnostic so as to avoid “infecting” the API and persistence layers with beans implementing GWT’s IsSerializable interface.
    舉個例子,在服務(wù)端我們有個IUser接口的用戶模塊,這個借口繼承自IPersistable.gwt的實現(xiàn)接受和返回實現(xiàn)IsSerializable接口的GwtUser的實例并把這些實例利用commons-beanutils發(fā)送到服務(wù)端。
    ?對于這一點可能有些爭論,這樣做并不非必要。但是我覺得這點額外的工作將帶給你更為清晰的層次劃分。我們可以嵌入gwt到任何一點,而且可以轉(zhuǎn)換到springmvc或者struct或者其他的地方,而不需要擔(dān)心代碼上?的反應(yīng)。
    q:你發(fā)現(xiàn)gwt產(chǎn)生的javascript不能垮瀏覽器的地方了嗎?你發(fā)現(xiàn)gwt產(chǎn)生的javascript包含一些錯誤需要手動調(diào)試了嗎?
    a:都沒有,這正是令我們驚訝的地方。跨瀏覽器javascript的開發(fā)是PITA,而且GWT真正的把你從他那里隔離開來。
    我發(fā)現(xiàn)了大量的在FIREFOX和IE不同的地方,但是這些最后被確認都是CSS支持的問題而于GWT無關(guān)。
    我也遇到了一大隊JAVASCRIPT錯誤,但是這些錯誤都是應(yīng)為變量而不在初始化,這些問題很快就會找到并且不需要大量的調(diào)試。目前已經(jīng)完成的大多數(shù)工作并不全是ui控件的問題,或許隨著我們的深入,我們會遇到一些問題,但是目前為止,我們還沒有多少麻煩。
    q:你的工作組的成員是更喜歡java還是javascript呢?
    顯然是java,哈哈。但是我們有人對javascript和actionscript也很精通。就像譯者本人。
    q:一句話,對正在考慮gwt的人,你有什么建議?你會推薦他嗎?你對這項技術(shù)的客觀觀點是什么?thumbs up or thumbs down?
    a:目前是thumbs up.我們目前仍然在開發(fā)的早期,而且我還不想說在它是完美的或者在以后的進程中不會咬我們一口。意思是說,你的建構(gòu)要搭好。 它真的像是在作swing或者其他UI的桌面應(yīng)用。
    ?我們用基于Controller和IView實現(xiàn)的GWT生成了全部的ui.除了gwt模塊引入以外,那里沒有html。
    ? 這是對幾乎所有主流web應(yīng)用范例的違背,但是如果你喜歡ui編程,他完美的抽象了ajax/dhtml的行為到一個十分友好和可擴展的api.
    ? 我或許會說如果你的工作是php,asp或者其他語言,你或許需要花更多的功夫。如果你已經(jīng)是一個有經(jīng)驗的java程序員,那么你可以很快投入其中。

    posted @ 2006-07-08 13:47 binge 閱讀(1170) | 評論 (0)編輯 收藏

    java.util.Date和java.sql.Date

    java.sql.Date,java.sql.Time和java.sql.Timestamp三個都是java.util.Date的子類(包裝類)。
    但是為什么java.sql.Date類型的值插入到數(shù)據(jù)庫中Date字段中會發(fā)生數(shù)據(jù)截取呢?
    java.sql.Date是為了配合SQL DATE而設(shè)置的數(shù)據(jù)類型。“規(guī)范化”的java.sql.Date只包含年月日信息,時分秒毫秒都會清零。格式類似:YYYY-MM-DD
    當(dāng)我們調(diào)用ResultSet的getDate()方法來獲得返回值時,java程序會參照"規(guī)范"的java.sql.Date來格式化數(shù)據(jù)庫中的數(shù)值。因此,如果
    數(shù)據(jù)庫中存在的非規(guī)范化部分的信息將會被劫取。在sun提供的ResultSet.java中這樣對getDate進行注釋的:
    Retrieves the value of the designated column in the current row of this <code>ResultSet</code> object as a “java.sql.Date” object in the Java programming language.
    同理。如果我們把一個java.sql.Date值通過PrepareStatement的setDate方法存入數(shù)據(jù)庫時,java程序會對傳入的java.sql.Date規(guī)范化
    ,非規(guī)范化的部分將會被劫取。
    ?然而,我們java.sql.Date一般由java.util.Date轉(zhuǎn)換過來,如:java.sql.Date sqlDate=new java.sql.Date(new java.util.Date().getTime()).
    ?顯然,這樣轉(zhuǎn)換過來的java.sql.Date往往不是一個規(guī)范的java.sql.Date.
    ?在http://www.thunderguy.com/semicolon/2003/08/14/java-sql-date-is-not-a-real-date/ 文章中提到,要保存java.util.Date的精確值,
    ?我們需要利用java.sql.Timestamp.
    ?感謝這篇文章的鋪墊:http://community.csdn.net/Expert/topic/4354/4354971.xml?temp=.5256616

    posted @ 2006-07-06 16:51 binge 閱讀(4283) | 評論 (0)編輯 收藏

    log4j配置概要

    官方網(wǎng)址:
    http://logging.apache.org/log4j/docs/index.html

    一個中文翻譯的文檔:

    http://www.jaxwiki.org/zh/project/logging.apache.org/log4j/docs/manual.html


    我摘出黃色字體表明幾條列在下面,也是筆者認為log4j最主要特點的濃縮:

    1.階層式的命名:

          如果一個logger 的名字后面跟著一個點號(dot),它就是點號(dot)后面的那個logger的前輩( ancestor),是這個晚輩(descendant) 的前綴。如果在它自己和這個晚輩之間沒有其它的前輩,它和這個晚輩之間就是關(guān)系。

    2.級別繼承

       對于一個給定的logger C,它繼承的級別等于logger階層里,從C開始往root logger上去的第一個non-null級別。


    3.執(zhí)行規(guī)則

       在一個級別為q(被指定的或繼承的)的logger里,一個級別為p的日志請求,只有在p >= q 時才能夠被執(zhí)行。

    4.appender添加性的規(guī)則

    Logger C的log輸出信息將被輸出到C的所有appenders和它的前輩的 appenders。這就是"appender additivity"的意思。但是,如果logger C的前輩,比如說P,P的additivity flag被設(shè)置為 false,那么,C的輸出信息將被輸出到C的所有appenders中去,以及它的前輩的——截止在P那里,包括P在內(nèi)的,appenders中去,但是不會輸出到P的前輩的 appenders中去。 默認情況下,Loggers的additivity flag設(shè)置為true

    關(guān)于日志格式:暫貼幾個樣例:
    log4j.appender.A1.layout.ConversionPattern=%d %-5p [%t] %-c (%13F:%L) %3x - %m%n

    在配置文件中,log4j可以訪問到系統(tǒng)環(huán)境變量。具體的變量參考相關(guān)資料。
    一篇我很早以前在csdn寫的文章:
    http://blog.csdn.net/huabingl/archive/2005/02/19/293933.aspx

    posted @ 2006-07-04 10:07 binge 閱讀(531) | 評論 (0)編輯 收藏

    Mysql數(shù)據(jù)庫使用技巧

      我承認我用mysql有很長時間了,不過似乎我仍然很白。好吧,還是寫寫吧。
      1。1067錯誤,無法啟動。7/3/2006
         解決步驟和方案:察看日至,mysql.user表莫名其妙的弄丟了。從其他地方扒下一個放在這里就可以了。
     2.非安裝版mysql的安裝和啟動。
         一般情況下,本人習(xí)慣用非安裝版的軟件。為了安裝方便,你可以把解壓后的文件拷貝到c盤根目錄下,并把總目錄改為mysql.然后進入windows命令 控制臺,在c:/mysql/bin下面運行mysqld-nt --install把它安裝為一個服務(wù),然后調(diào)用net start mysql啟動它,停止的命令是net stop mysql  .想要移除這個服務(wù),用命令mysqld-nt --remove
     3.訪問mysql的命令:mysql -h host -u user -p 。不過有好多好用的客戶端可以使用,比如5.0自帶的工具和SQLyog Enterprise
     4。庫表相關(guān)的命令:SHOW DATABASES;SHOW TABLES;DESCRIBE table1/desc table1;
     5.察看當(dāng)前配置:show variables;
     6.關(guān)于中文亂碼問題,到一定積累,筆者準備開專題。目前簡要列下:
       在mysql的一次會話中,服務(wù)器收到客戶端發(fā)來的指令后,大致要執(zhí)行3個動作:
      1、服務(wù)器認為收到的指令是按當(dāng)前character_set_client環(huán)境變量所指定的字符集編碼的,
      2、然后再將其轉(zhuǎn)換成character_set_connection所指定的字符集編碼
      3、分析、執(zhí)行該指令。
      4、 用character_set_results變量所指定的字符集返回服務(wù)器向客戶端傳輸?shù)臄?shù)據(jù)
     解決這個問題的關(guān)鍵點在于設(shè)置 default-character-set 變量。
    7,在創(chuàng)建數(shù)據(jù)庫的時候,我們有時會需要提供一些編碼上的參數(shù),如:
    #1. Create mvnforum database with the "Create database" syntax (for unicode and others):
    #   mysql> CREATE DATABASE mvnforum CHARACTER SET [charater_set] COLLATE [collation]
    #  mysql> CREATE DATABASE mvnforum CHARACTER SET utf8 collate
    #   Where charater_set and collation : @see http://dev.mysql.com/doc/refman/4.1/en/charset-mysql.html
    #
    #   a, practice to view all supported character set
    #      mysql> SHOW CHARACTER SET;
    #   b, practice to view all supported collation:
    #      mysql> SHOW COLLATION;
    #
    #   c, Example for Unicode:
    #      mysql> CREATE DATABASE mvnforum CHARACTER SET utf8 COLLATE utf8_general_ci
    #"
    "
       未完待續(xù)。
      歡迎回帖。

    posted @ 2006-07-03 23:16 binge 閱讀(1444) | 評論 (2)編輯 收藏

    關(guān)于異常Exception

    1。什么是異常
    ???異常是一種狀態(tài),是程序出現(xiàn)了符合該異常條件的一種狀態(tài)。因此,他也可以說成是一種條件。
    2。為什么要捕獲異常
    ? 捕獲異常是為了對程序中出現(xiàn)的某種狀況進行處理。如果有異常而沒有捕獲,異常將會向上一層傳播,最終導(dǎo)致線程在此中止。
    3。什么是check異常和unchecked異常
    ? uncheck異常一般是RuntimeException.出現(xiàn)這類異常,編譯器不會強制要用戶去捕獲(當(dāng)然你可以捕獲)。?? 編譯器會強制要求用戶對checked異常進行捕獲并作出一定的處理。
    4。為什么不推薦捕獲頂層異常(Exception)
    ? 程序中會發(fā)生各種各樣的異常。除非你的程序是個終端(一個業(yè)務(wù)的終點),否則不推薦捕獲頂層異常。
    ?在程序的中間環(huán)節(jié)捕獲所有異常毫無意義,并有可能導(dǎo)致流程上的隱患。比如,出現(xiàn)某種異常后,期望線程就此結(jié)束,不去做下面的工作,但是如果在中間環(huán)節(jié)對頂層異常進行了非法處理,程序有可能會運行下去,將導(dǎo)致不可控的錯誤。
    5。為什么要自定義異常
    ?自定義異常是為了設(shè)置異常鏈的起點。一般情況下,我們都是允許每個程序員看到所有的異常信息,這個時候大多數(shù)都是把下一層的異常直接重擲到上一層。然而在多層次的結(jié)構(gòu)中,我們有時候需要隱藏底層異常(這種異常的信息很多,很枯燥),而給消費者提供一個更為直觀的異常,這個時候我們需要自定義異常。有的異常類jdk已經(jīng)給我們提供,比如常用的IllegalArgumentException。如果你想在此再作包裝,你可以創(chuàng)建自己的異常類。如此,消費者將以此異常作為異常鏈的起點。
    6。為什么要重擲異常
    ?重擲異常是處理異常的一種方式。在捕獲了某種異常后,用戶可能不希望在這一層做出裁決,或者即使做出了一定的處理,但仍然需要向上一層報告,因此需要重擲異常。
    7。異常機制。
    ?? 一旦某個點發(fā)生異常,這個點下面和catch語句之間的代碼將不會被執(zhí)行。因此,異常是一種中止流程的很有效的機制。
    ?? 關(guān)于異常,在effective java中提到“異常轉(zhuǎn)譯”和“異常連接”的概念。本人傾向于用“異常轉(zhuǎn)譯”,前提是要配置log4j,并作詳細的日志紀錄。

    posted @ 2006-06-29 11:40 binge 閱讀(1405) | 評論 (1)編輯 收藏

    XMLBeans

    ?XmlBeans由 BEA公司發(fā)明,后捐贈給Apache基金會的。
    ?在項目中遇到這樣的需求,根據(jù)已有的schema對xml進行格式校驗,并讀取出xml得數(shù)據(jù)。
    ?在大搜一番后,我最終把目光停留在xmlbeans上面。被淘汰的是digester.
    ?下面是一篇dev2dev得文章:
    ??http://dev2dev.bea.com/pub/a/2006/05/xmlbeans-2.html?page=4
    ?我就不炒飯了。
    ?好心的人給簡單翻譯了一下:
    http://dev2dev.bea.com.cn/techdoc/200403127.html
    ?翻譯得內(nèi)容很少,有空本人補上。
    ibm dw上也有個豆腐塊:
    http://www-128.ibm.com/developerworks/cn/xml/x-beans1/
    關(guān)于digester的內(nèi)容,只選了一篇文章:來自devx得
    http://www.devx.com/Java/Article/21832/1763

    關(guān)于2中方法的對比,他們的文章已經(jīng)說的很詳細了。

    xmlbeans采用的是sax來讀取數(shù)據(jù)。2004年,由bea公司發(fā)明的stax(stream API for XML)已經(jīng)被jcp列為標準jsr-173,在jdk6.0中會出現(xiàn)。
    ?
    關(guān)于stax,sax和dom的對比超出本篇范圍,在此略過。
    后記:
    ? 在正在完成的項目中,我采用了xmlbeans,它的引入給我?guī)砹撕艽蟮姆奖?

    posted @ 2006-06-21 13:50 binge 閱讀(629) | 評論 (0)編輯 收藏

    僅列出標題
    共4頁: 上一頁 1 2 3 4 下一頁 
    主站蜘蛛池模板: 九九全国免费视频| 免费AA片少妇人AA片直播 | 亚洲人成色7777在线观看| 欧洲人成在线免费| 亚洲一区二区影视| 国产成人高清亚洲| A在线观看免费网站大全| 黄页网址大全免费观看12网站| 国产午夜亚洲不卡| 麻豆一区二区免费播放网站| 日韩毛片一区视频免费| 久久久久亚洲精品日久生情 | 亚洲国产中文在线视频| 四虎永久在线免费观看| 99免费在线观看视频| 爱情岛亚洲论坛在线观看| 久久91亚洲精品中文字幕| 大学生一级特黄的免费大片视频| 成在人线av无码免费高潮水| 亚洲综合一区二区三区四区五区| 亚洲综合日韩久久成人AV| 成年午夜视频免费观看视频 | 亚洲国产一成人久久精品| 最近最好的中文字幕2019免费 | 最近免费中文字幕高清大全| 青娱乐在线免费观看视频| 亚洲妇女水蜜桃av网网站| 中文字幕中韩乱码亚洲大片| 性做久久久久免费看| 182tv免费观看在线视频| 一个人看的www免费高清| 亚洲日韩精品无码AV海量| 亚洲视频2020| 中文亚洲AV片不卡在线观看| 国产一级特黄高清免费大片| 真人做人试看60分钟免费视频| 国内精品免费久久影院| caoporn国产精品免费| 黑人粗长大战亚洲女2021国产精品成人免费视频| 亚洲AV无码国产精品色午友在线 | 久久精品国产亚洲av高清漫画 |