John Jiang

          a cup of Java, cheers!
          https://github.com/johnshajiang/blog

             :: 首頁 ::  :: 聯(lián)系 :: 聚合  :: 管理 ::
            131 隨筆 :: 1 文章 :: 530 評(píng)論 :: 0 Trackbacks
          詳解Eclipse斷點(diǎn)
          大家肯定都用過Eclipse的調(diào)試的功能,在調(diào)試的過程中自然也無法避免要使用斷點(diǎn)(breakpoint),但不知是否對(duì)Eclipse中各類斷點(diǎn)都有所了解。本篇圖文并茂地介紹了Eclipse中全部類型的斷點(diǎn),及其設(shè)置,希望對(duì)大家有所幫助。(2011.11.20)

          1. 示例程序
          BreakpointDemo是一個(gè)臆造的應(yīng)用程序,只是為了便于講解Eclipse中各類斷點(diǎn)的使用罷了。其代碼如下圖所示,

          BreakpointDemo主要包含兩個(gè)方法:
          [1]setValue,該方法根據(jù)指定的次數(shù)(count),對(duì)成員變量value進(jìn)行賦值,值的范圍為0-9的隨機(jī)整數(shù)。
          [2]printValue,該方法會(huì)調(diào)用setValue()對(duì)value進(jìn)行賦值,并打印出value的值;但,如果value能被3整除,那么就會(huì)拋出IllegalArgumentException異常。

          2. Line Breakpoint
          Line Breakpoin是最簡(jiǎn)單的Eclipse斷點(diǎn),只要雙擊某行代碼對(duì)應(yīng)的左側(cè)欄,就對(duì)該行設(shè)置上斷點(diǎn)。此處,對(duì)第20行代碼設(shè)置上Line Breakpoint,如下圖所示,

          可以為Line Breakpoint設(shè)置一個(gè)條件,那么當(dāng)程序運(yùn)行到該斷點(diǎn)時(shí),只有滿足設(shè)定的條件,才會(huì)被中斷。右鍵點(diǎn)擊第20行的斷點(diǎn),選擇"Breakpoint Properties..."

          在彈出的屬性對(duì)話框中,勾選上"Conditional",然后在文本框中輸入"count % 2 == 0"。

          該條件表示,當(dāng)程序運(yùn)行到第20行時(shí),只有當(dāng)count為偶數(shù)時(shí),程序才會(huì)被中斷。細(xì)心地話,你會(huì)發(fā)現(xiàn)該斷點(diǎn)的圖標(biāo)發(fā)生了改變,多了一個(gè)問號(hào)。


          3. Watchpoint
          Line Breakpoint關(guān)注于程序運(yùn)行的"過程",大家也常把使用這種斷點(diǎn)的調(diào)試稱為單步調(diào)試。但有時(shí)候,我們對(duì)程序的運(yùn)行過程不太了解,可能也不太關(guān)心,不能確定在什么地方設(shè)置斷點(diǎn)比較合適,而可能比較關(guān)注某個(gè)關(guān)鍵變量的變化或使用。此時(shí),就可以為該變量設(shè)置一種特殊的斷點(diǎn)--Watchpoint。在此示例,我們最關(guān)心的就是成員變量value的值,那么就可以為它設(shè)置一個(gè)Watchpoint,雙擊第9行代碼對(duì)應(yīng)的左側(cè)欄就可以了。

          使用在2中所提及的方法,查看該斷點(diǎn)的屬性,

          默認(rèn)地,當(dāng)該變量被訪問或它的值被修改時(shí),程序都會(huì)被中斷。但在本示例中,只希望當(dāng)對(duì)value的值進(jìn)行修改時(shí)程序才需要被中斷,所以取消對(duì)"Access"的勾選。

          這時(shí),我們會(huì)發(fā)現(xiàn)原來的Watchpoin圖標(biāo)也有變化了。


          4. Method Breakpoint
          與關(guān)注對(duì)某個(gè)變量的訪問與修改一樣,我們也可以關(guān)注程序?qū)δ硞€(gè)方法的調(diào)用情況,即,可以設(shè)置Method Breakpoint。在此處,設(shè)置針對(duì)方法setValue的Method Breakpoint。同理,雙擊第11行代碼對(duì)應(yīng)的左側(cè)欄即可。

          仍然要查看該斷點(diǎn)的屬性。默認(rèn)地,只勾選了"Entry",而沒有勾選"Exit"。

          這表示,當(dāng)剛進(jìn)入該方法(調(diào)用開始)時(shí),程序會(huì)被中斷;而,離開該方法(調(diào)用結(jié)束)時(shí),程序并不會(huì)被中斷。在本示例中,需要同時(shí)勾選上"Exit"。

          點(diǎn)擊OK之后,可以看到該斷點(diǎn)的圖標(biāo)也有所改變。

          根據(jù)這里的設(shè)置,當(dāng)程序運(yùn)行到第20行后會(huì)在第12行被中斷,盡管這里沒有顯式的斷點(diǎn),但這就是setValue()方法的入口(Entry)。必須注意地是,程序在運(yùn)行到第16行時(shí)不會(huì)被中斷,盡管它看起來像是setValue()方法的出口(Exit)。實(shí)際上,程序會(huì)在第17行被中斷,這里才是setValue()調(diào)用結(jié)束的地方。

          5. Exception Breakpoint
          如果,我們期望某個(gè)特定異常發(fā)生時(shí)程序能夠被中斷,以方便查看當(dāng)時(shí)程序所處的狀態(tài)。通過設(shè)置Exception Breakpoint就能達(dá)到這一目標(biāo)。本示例故意在第23行拋出了IllegalArgumentException異常,我們期望程序運(yùn)行到此處時(shí)會(huì)被中斷。但我們不直接為此行代碼設(shè)置Line Breakpoint,而是為IllegalArgumentException設(shè)置Exception Breakpoint。設(shè)置Exception Breakpoint的方法與其它類型斷點(diǎn)都不同,它不能通過雙擊左側(cè)欄的方式在代碼編輯器上直接進(jìn)行設(shè)置。點(diǎn)擊Breakpoints視圖右上角形如Ji的圖標(biāo),

          會(huì)彈出如下所示的對(duì)話框,

          在其中選中IllegalArgumentException,并點(diǎn)擊OK,這時(shí)一個(gè)Exception Breakpoint就設(shè)置好了。

          當(dāng)value為3的倍數(shù)時(shí),程序會(huì)在第23行被中斷,這時(shí)我們就能使用調(diào)試器來看看value具體是等于0,3或6。

          6. Class Load Breakpoint
          還有一種大家平時(shí)可能不太用的斷點(diǎn)--Class Load Breakpoint,即當(dāng)某個(gè)類被加載時(shí),通過該斷點(diǎn)可以中斷程序。


          小結(jié)
          上述的Eclipse斷點(diǎn),我們?cè)诂F(xiàn)實(shí)工作中肯定都有意或無意地使用過其中的幾種,只是不一定十分了解內(nèi)情罷了。使用好Eclipse的各種斷點(diǎn),可以把很好地幫助我們分析程序,定位問題。

          posted on 2011-11-20 20:57 John Jiang 閱讀(21141) 評(píng)論(13)  編輯  收藏 所屬分類: EclipseJava原創(chuàng)

          評(píng)論

          # re: 詳解Eclipse斷點(diǎn)(原) 2011-11-21 13:15 ghy
          老大,不要太猛啊,  回復(fù)  更多評(píng)論
            

          # re: 詳解Eclipse斷點(diǎn)(原) 2011-11-21 20:01 Sha Jiang
          @ghy
          很猛嗎@_@  回復(fù)  更多評(píng)論
            

          # re: 詳解Eclipse斷點(diǎn)(原) 2011-11-22 10:48 星期五
          不錯(cuò),學(xué)習(xí)  回復(fù)  更多評(píng)論
            

          # re: 詳解Eclipse斷點(diǎn)(原) 2011-11-24 09:56 study
          這個(gè)敢說原創(chuàng),前年我就看過了  回復(fù)  更多評(píng)論
            

          # re: 詳解Eclipse斷點(diǎn)(原) 2011-11-24 14:21 Sha Jiang
          @study
          關(guān)于Eclipse斷點(diǎn)的文章肯定很多人在很早之前就寫過了...但本文中的每一個(gè)文字,每一行代碼,都是我自己寫的,每一張圖片也是我自己親自截取的,沒有抄襲過任何人,所以我敢說本文是我的原創(chuàng)...  回復(fù)  更多評(píng)論
            

          # re: 詳解Eclipse斷點(diǎn)(原)[未登錄] 2011-11-25 00:17 atom
          講得最清楚的一篇。如果提供代碼下載就更好了。  回復(fù)  更多評(píng)論
            

          # re: 詳解Eclipse斷點(diǎn)(原) 2011-11-25 10:47 Sha Jiang
          @atom
          就那么幾行代碼,隨便敲敲鍵盤就OK ^_^  回復(fù)  更多評(píng)論
            

          # re: 詳解Eclipse斷點(diǎn)(原) 2011-12-15 20:53 leckie
          寫的不錯(cuò)!非常有用!~  回復(fù)  更多評(píng)論
            

          # re: 詳解Eclipse斷點(diǎn)(原) 2011-12-25 10:53 那天的雪
          不錯(cuò) 很好  回復(fù)  更多評(píng)論
            

          # re: 詳解Eclipse斷點(diǎn)(原) 2012-06-09 10:39 KZ
          that's good article.  回復(fù)  更多評(píng)論
            

          # re: 詳解Eclipse斷點(diǎn)(原) 2013-02-17 10:23 alice.xu
          @study
          只能說 真理是放置四海皆準(zhǔn)的 這個(gè)就是這樣做的 就算你原創(chuàng)也會(huì)是這樣做 看上去像抄襲的  回復(fù)  更多評(píng)論
            

          # re: 詳解Eclipse斷點(diǎn)(原) 2013-05-07 22:44 呵呵呵
          啥呀這是  回復(fù)  更多評(píng)論
            

          # 還有一個(gè)類加載異常[未登錄] 2013-09-01 10:26 Justin
          還有一個(gè)類加載異常  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 水富县| 合作市| 巨鹿县| 安顺市| 富顺县| 菏泽市| 称多县| 安达市| 沙坪坝区| 西青区| 淮北市| 浑源县| 宁都县| 枞阳县| 永康市| 将乐县| 虹口区| 迭部县| 南漳县| 湖口县| 静乐县| 色达县| 南安市| 西和县| 泰宁县| 重庆市| 台山市| 维西| 澄迈县| 澄城县| 杭锦后旗| 尉犁县| 灵丘县| 丹寨县| 紫阳县| 台南市| 海城市| 厦门市| 乳山市| 肇州县| 法库县|