1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        IDEA Debug 高階技巧,老手都是這么玩的~~

        共 5777字,需瀏覽 12分鐘

         ·

        2024-11-12 12:20

        無需魔法,國內(nèi)可直接使用官方ChatGPT-4(Plus)、ChatGPT-4o!

        來源:juejin.cn/post/7308539123537592357

        • 目錄
        • 引言
        • Debug基礎(chǔ)
        • 高階技巧-條件斷點
          • 條件斷點應(yīng)用場景
          • 如何添加條件斷點
          • 條件斷點對于閱讀源碼的幫助
        • 高階技巧-計算器
          • 查看變量值
          • 修改變量值
          • 測試表達(dá)式
          • 執(zhí)行方法調(diào)用:

        目錄

        圖片

        引言

        IntelliJ IDEA,由JetBrains(捷克共和國)開發(fā)的一款強(qiáng)大的Java集成開發(fā)環(huán)境(IDE),因其豐富的功能、智能的代碼輔助以及用戶友好的界面設(shè)計,在全球范圍內(nèi)廣受Java開發(fā)者的喜愛,在國內(nèi),筆者遇到過不使用IDEA的Java程序員不超過三個。不僅限于Java,IntelliJ IDEA還支持多種其他編程語言和框架,如Kotlin、ScalaGroovy以及Android開發(fā)等,這進(jìn)一步擴(kuò)大了其用戶基礎(chǔ)。其社區(qū)版是免費(fèi)的,而專業(yè)版則提供了更為高級的功能。

        Debug(調(diào)試)是軟件開發(fā)中不可或缺的一個環(huán)節(jié)。它使開發(fā)者能夠逐行執(zhí)行代碼,檢查運(yùn)行時的狀態(tài),包括變量值、內(nèi)存占用、線程狀態(tài)等,從而幫助開發(fā)者理解代碼的實際行為,定位并修復(fù)錯誤。良好的調(diào)試工具可以顯著提高問題解決的效率,減少猜測工作,幫助開發(fā)者構(gòu)建更加穩(wěn)定、高效的軟件系統(tǒng)。

        對了,最近我整理了上百本電子書/軟件/視頻以及面試題,還在持續(xù)更新中,全部免費(fèi),文檔地址:

        https://r86oxhhvu2.feishu.cn/wiki/ZMq0wjeFFiRRbvk9NeFcf7uknsJ


        在本文中,我將向大家介紹及演示IDEA的高階Debug技巧,包含但不限于:

        • 條件斷點(Conditional breakpoint): 允許開發(fā)者設(shè)置特定條件,只有當(dāng)這些條件滿足時,程序才會在這些斷點處暫停執(zhí)行。這對于調(diào)試復(fù)雜的循環(huán)和分支邏輯尤其有用,因為它可以讓你聚焦于特定的執(zhí)行路徑或案例。
        • 計算器(Evaluate Expression): 這個功能允許開發(fā)者在調(diào)試會話中計算表達(dá)式的值,不僅可以查看變量的當(dāng)前值,還可以執(zhí)行表達(dá)式,甚至調(diào)用方法。這對于驗證假設(shè)和測試代碼更改而無需重新啟動整個調(diào)試會話非常有用。

        Debug基礎(chǔ)

        寫一段代碼,開啟調(diào)試:

        圖片
        操作 Windows Mac(OS X)
        進(jìn)入下一步,如果當(dāng)前行斷點是一個方法,則不進(jìn)入當(dāng)前方法體內(nèi) F8 F8(Fn)
        進(jìn)入下一步,如果當(dāng)前行斷點是一個方法,則進(jìn)入當(dāng)前方法體內(nèi), 如果該方法體還有方法,則不會進(jìn)入該內(nèi)嵌的方法中 F7 F7(Fn)
        智能步入,斷點所在行上有多個方法調(diào)用,會彈出進(jìn)入哪個方法 Shift + F7 ?F7 (Fn)
        智能跳出 Shift + F8 ?F8 (Fn)
        恢復(fù)程序運(yùn)行,如果該斷點下面代碼還有斷點則停在下一個斷點上 F9 F9(Fn)
        運(yùn)行到光標(biāo)處,如果光標(biāo)前有其他斷點會進(jìn)入到該斷點 Alt + F9 ?F9(Fn)
        計算表達(dá)式(可以更改變量值使其生效) Alt + F8 ?F8 (Fn)
        切換斷點(若光標(biāo)當(dāng)前行有斷點則取消斷點,沒有則加上斷點) Ctrl + F8 ?F8 (Fn)
        查看斷點信息 Ctrl + Shift + F8 ??F8 (Fn)

        高階技巧-條件斷點

        我們構(gòu)造一個List<User>用來模擬從數(shù)據(jù)庫查詢出列表,第三個元素id=3中的age屬性是null,我們在for循環(huán)中使用加法來觸發(fā)Integer類型的拆箱來出發(fā)空指針異常。

        public class IDEATest {
         public static void main(String[] args) {

          List<User> userList = new ArrayList<>(6);
          userList.add(new User(1, "Tom", 19));
          userList.add(new User(2, "Giles", 25));
          userList.add(new User(3, "Alex", null));
          userList.add(new User(4, "Ryan", 21));
          userList.add(new User(5, "DongGe", 19));
          userList.add(new User(6, "RUI", 21));

          userList.forEach(user -> {
           String name = user.getName();
           int futureAge = user.getAge() + 10;
           System.out.println(name + " 10年后" + futureAge + "歲");
          });
         }

        }

        @Data
        @AllArgsConstructor
        @NoArgsConstructor
        class User {
         private Integer id;

         private String name;

         private Integer age;
        }

        圖片

        可以看到IDEA提示了第25行代碼報了錯,我們定位到第25行代碼內(nèi)容:

        圖片

        為了定位問題,我們在第25行打個斷點:

        圖片

        null + 10

        在Java中,null是一個字面量,用來表示沒有任何對象與之關(guān)聯(lián)的引用。而+操作符在Java中主要有兩種用途:一是作為數(shù)學(xué)加法運(yùn)算符,用于基本數(shù)據(jù)類型的數(shù)值相加;二是作為字符串連接運(yùn)算符,用于將兩個字符串拼接在一起。

        當(dāng)你嘗試執(zhí)行null + 10這樣的表達(dá)式時,Java會嘗試找到一個合適的操作符重載來處理這個表達(dá)式。由于null不是一個數(shù)值,所以不能直接進(jìn)行數(shù)學(xué)加法。但是,如果參與+操作的任一操作數(shù)是一個字符串,Java會將另一個操作數(shù)轉(zhuǎn)換為字符串,并執(zhí)行字符串連接操作。

        對了,最近我整理了上百本電子書/軟件/視頻以及面試題,還在持續(xù)更新中,全部免費(fèi),文檔地址:

        https://r86oxhhvu2.feishu.cn/wiki/ZMq0wjeFFiRRbvk9NeFcf7uknsJ

        條件斷點應(yīng)用場景

        為了定位到具體哪一條數(shù)據(jù)出了問題,我們需要按F9或點擊箭頭處按鈕直到循環(huán)到錯誤數(shù)據(jù),案例中共6條數(shù)據(jù),即使最后一條數(shù)據(jù)錯誤,我們也只需要按五次即可發(fā)現(xiàn)問題數(shù)據(jù),但是在正式/測試環(huán)境中,你無法確認(rèn)從數(shù)據(jù)庫中查詢到多少條數(shù)據(jù),假如是1000條,接下來很長一段時間你將被這個問題所困擾。顯然我們應(yīng)該拒絕這種沒有效率、無意義、重復(fù)性的工作。

        如何添加條件斷點

        鼠標(biāo)移至紅色斷點處,使用右鍵:

        圖片

        圖片

        Condition中添加判斷條件,上文中出現(xiàn)的異常是NullPointerException,我們就判斷循環(huán)中的user對象age變量為null的即可:

        Objects.isNull(user.getAge())  

        點擊Done,確認(rèn)。

        圖片

        重啟Debug,我們可以看到循環(huán)出的第一條數(shù)據(jù)不再是列表的第一條,而是問題數(shù)據(jù):

        圖片

        這樣我們便可以很快的定位到錯誤數(shù)據(jù),解決問題。

        條件斷點對于閱讀源碼的幫助

        例如,我們在閱讀Spring Framework源碼時,條件斷點可以幫助我們快速定位到正在目標(biāo)Bean。

        Spring Boot項目在啟動時,會加載所有被標(biāo)注的元數(shù)據(jù),此時我們自定義了一個Bean的類型叫a,我們可以在BeanFactoryUtils對應(yīng)的加載方法中添加條件斷點,這樣就可以更快的查看我們自定義的Bean的加載邏輯。

        圖片

        圖片

        高階技巧-計算器

        在2023新版IDEA中,可以通過以下步驟找到計算器,或者通過快捷鍵的方式找到計算器。

        圖片

        圖片

        查看變量值

        在斷點暫停時,你可以使用計算器來查看和評估變量的當(dāng)前值,這比在變量監(jiān)視窗口中查找要快得多。

        圖片

        修改變量值

        修改變量值:如果你想要測試代碼對于不同變量值的反應(yīng),可以使用計算器改變變量的值,而無需修改代碼并重新啟動調(diào)試過程。

        圖片

        圖片

        測試表達(dá)式

        如果你在編寫代碼時不確定某個表達(dá)式的結(jié)果,可以使用計算器快速進(jìn)行測試,而不必寫額外的測試代碼或者等待代碼運(yùn)行到那一點。

        對了,最近我整理了上百本電子書/軟件/視頻以及面試題,還在持續(xù)更新中,全部免費(fèi),文檔地址:

        https://r86oxhhvu2.feishu.cn/wiki/ZMq0wjeFFiRRbvk9NeFcf7uknsJ

        圖片

        執(zhí)行方法調(diào)用:

        通過計算器,你可以在不影響當(dāng)前程序執(zhí)行狀態(tài)的情況下執(zhí)行方法,這樣可以幫助你理解方法的行為或者驗證方法的返回值。

        圖片


            
        END

        普通人也能直接使用ChatGPT-4/ChatGPT4o


        一次性買了幾百個ChatGPT官方賬號,放在一個系統(tǒng)的池子里。共享給大家使用。不需要翻墻,就可以體驗到官方正版賬號。而且突破官方提問次數(shù)的限制。正版保證!支持GPTs、語音、聯(lián)網(wǎng)、上傳文件等功能

        更多介紹點這里,無需魔法使用官方ChatGPT-4(Plus)、ChatGPT-4o!

        每月只需72元! 


        掃碼可以加我微信購買,備注:GPT

        每天只要一瓶可樂錢


        瀏覽 327
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            亚洲乱伦一区二区 | 肏屄网| 日韩中文字幕人妻 | 老外把我添高潮了视频 | 夜夜夜夜夜夜爽 | 美女被c在线观看视频 | 欧美久久精品一级黑人c片 | 嫩草精品| 99久久大香伊蕉 | 黄色三级片在线观看 |