IntelliJ IDEA,由JetBrains(捷克共和國)開發的一款強大的Java集成開發環境(IDE),因其豐富的功能、智能的代碼輔助以及用戶友好的界面設計,在全球范圍內廣受Java開發者的喜愛,在國內,筆者遇到過不使用IDEA的Java程序員不超過三個。不僅限于Java,IntelliJ IDEA還支持多種其他編程語言和框架,如Kotlin、Scala、Groovy以及Android開發等,這進一步擴大了其用戶基礎。其社區版是免費的,而專業版則提供了更為高級的功能。
Debug(調試)是軟件開發中不可或缺的一個環節。它使開發者能夠逐行執行代碼,檢查運行時的狀態,包括變量值、內存占用、線程狀態等,從而幫助開發者理解代碼的實際行為,定位并修復錯誤。良好的調試工具可以顯著提高問題解決的效率,減少猜測工作,幫助開發者構建更加穩定、高效的軟件系統。
在本文中,我將向大家介紹及演示IDEA的高階Debug技巧,包含但不限于:
寫一段代碼,開啟調試:
操作 Windows Mac(OS X) 進入下一步,如果當前行斷點是一個方法,則不進入當前方法體內 F8 F8(Fn) 進入下一步,如果當前行斷點是一個方法,則進入當前方法體內, 如果該方法體還有方法,則不會進入該內嵌的方法中 F7 F7(Fn) 智能步入,斷點所在行上有多個方法調用,會彈出進入哪個方法 Shift + F7 ?F7 (Fn) 智能跳出 Shift + F8 ?F8 (Fn) 恢復程序運行,如果該斷點下面代碼還有斷點則停在下一個斷點上 F9 F9(Fn) 運行到光標處,如果光標前有其他斷點會進入到該斷點 Alt + F9 ?F9(Fn) 計算表達式(可以更改變量值使其生效) Alt + F8 ?F8 (Fn) 切換斷點(若光標當前行有斷點則取消斷點,沒有則加上斷點) Ctrl + F8 ?F8 (Fn) 查看斷點信息 Ctrl + Shift + F8 ??F8 (Fn)
表格來源于:
程序猿DD
我們構造一個List<User>用來模擬從數據庫查詢出列表,第三個元素id=3中的age屬性是null,我們在for循環中使用加法來觸發Integer類型的拆箱來出發空指針異常。
/**
* @author Liutx
* 公眾號:種棵代碼技術樹
* @since 2023-12-04 14:09
*/
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行代碼內容:
為了定位問題,我們在第25行打個斷點:
null + 10
在Java中,null是一個字面量,用來表示沒有任何對象與之關聯的引用。而+操作符在Java中主要有兩種用途:一是作為數學加法運算符,用于基本數據類型的數值相加;二是作為字符串連接運算符,用于將兩個字符串拼接在一起。
當你嘗試執行null + 10這樣的表達式時,Java會嘗試找到一個合適的操作符重載來處理這個表達式。由于null不是一個數值,所以不能直接進行數學加法。但是,如果參與+操作的任一操作數是一個字符串,Java會將另一個操作數轉換為字符串,并執行字符串連接操作。
為了定位到具體哪一條數據出了問題,我們需要按F9或點擊箭頭處按鈕直到循環到錯誤數據,案例中共6條數據,即使最后一條數據錯誤,我們也只需要按五次即可發現問題數據,但是在正式/測試環境中,你無法確認從數據庫中查詢到多少條數據,假如是1000條,接下來很長一段時間你將被這個問題所困擾。顯然我們應該拒絕這種沒有效率、無意義、重復性的工作。
鼠標移至紅色斷點處,使用右鍵:
在Condition中添加判斷條件,上文中出現的異常是NullPointerException,我們就判斷循環中的user對象age變量為null的即可:
Objects.isNull(user.getAge())
點擊Done,確認。
重啟Debug,我們可以看到循環出的第一條數據不再是列表的第一條,而是問題數據:
這樣我們便可以很快的定位到錯誤數據,解決問題。
例如,我們在閱讀Spring Framework源碼時,條件斷點可以幫助我們快速定位到正在目標Bean。
Spring Boot項目在啟動時,會加載所有被標注的元數據,此時我們自定義了一個Bean的類型叫a,我們可以在BeanFactoryUtils對應的加載方法中添加條件斷點,這樣就可以更快的查看我們自定義的Bean的加載邏輯。
在2023新版IDEA中,可以通過以下步驟找到計算器,或者通過快捷鍵的方式找到計算器。
在斷點暫停時,你可以使用計算器來查看和評估變量的當前值,這比在變量監視窗口中查找要快得多。
修改變量值:如果你想要測試代碼對于不同變量值的反應,可以使用計算器改變變量的值,而無需修改代碼并重新啟動調試過程。
如果你在編寫代碼時不確定某個表達式的結果,可以使用計算器快速進行測試,而不必寫額外的測試代碼或者等待代碼運行到那一點。
通過計算器,你可以在不影響當前程序執行狀態的情況下執行方法,這樣可以幫助你理解方法的行為或者驗證方法的返回值。
近期發布。
關于我
你好,我是Debug.c。微信公眾號:種棵代碼技術樹 的維護者,一個跨專業自學Java,對技術保持熱愛的bug猿,同樣也是在某二線城市打拼四年余的Java Coder。
在掘金、CSDN、公眾號我將分享我最近學習的內容、踩過的坑以及自己對技術的理解。
如果您對我感興趣,請聯系我。
若有收獲,就點個贊吧,喜歡原圖請私信我。
微軟Windows Storage Server (以下簡稱:WSS )是用于網絡附屬存儲(NAS)設備和iSCSI存儲系統的平臺。
WSS 是建立在Windows Server 操作系統之上,為基于文件的共享存儲提供像Microsoft Hyper-V、Microsoft SQL Server和Windows Server 互聯網信息服務((IIS)等應用程序。它還支持網絡文件系統(NFS)文件協議和塊存儲選項。
目前只有兩個版本, foundation和standard。這款產品分為兩個版本,工作組版與標準版。工作組版本主要針對小型用戶群組,授權許可中將其業務連接數量上限設置為250個。它同時也對底層硬件做出限制,要求用戶使用單CPU插槽、最高32GB內存及最多六塊磁盤驅動器。
其標準版則在功能與特性方面與Windows Server 2012標準版如出一轍。它能夠支持兩套Hyper-V,允許使用最高2TB內存及64個CPU插槽。除此之外,標準版也沒有限制業務連接與磁盤驅動器數量。同時兩個版本都能作為域控制器使用,大家可以通過Windows Server 標準版創建虛擬機并在該角色中使用。
WSS 是為云計算設計的,可以確保用戶能夠在私有云上使用混合應用程序,托管公有云、Windows Azure云等。這種多租戶環境下的產品工具可以幫助用戶執行服務等級協議(SLA),確保使用拒付情況。
Windows Storage Server中一些關鍵的存儲功能:
? 池化多個物理磁盤。
? 增強服務器信息塊(SMB 3.0)協議。
? 支持NFS、iSCSI
? 完美支持虛擬化平臺(hyper-v、vsphere等)
? 卸載從服務器傳輸到外部存儲陣列的數據。
? 提高數據完整性、可用性和可擴展性的新的彈性文件系統(ReFS)。
? 單點管理、配置和部署多個虛擬桌面和會議。
? 有一個統一接口,使用Windows管理規范(WMI)來管理物理和虛擬存儲,包括第三方外部存儲子系統。
? 支持實時分配(也稱自動精簡配置)。
? 降低NTFS數據量上的主存儲空間需求。
? 分層存儲
安裝WSS非常簡單,和安裝windows server 操作系統一樣,這里就不再詳細說明。
但是有兩點需要注意的地方
WSS 存儲的設計思想和IBM V系列存儲類似,都是把添加到一個存儲池里,支持動態擴容,然后從POOL劃分邏輯卷,映射給主機。建議采用一個存儲池即可,如果有多鐘磁盤類型(如SAS、SATA),建議按不同磁盤類型的去劃分存儲池。
本節討論如何新建存儲Pool。具體操作如下:
1、打開服務器管理器,展開“文件和存儲服務”,選擇存儲池,如果有可用的磁盤,會發現在storage spaces下有一個原始池,名稱為“primordial”包含了可用磁盤的信息,右鍵選中“新建存儲池”,如下圖所示
2、點擊“下一步”
4、選中可用的物理磁盤,這里還可以的磁盤分配類型有兩個選擇“自動”和“熱備用”,其中自動是默認選擇,“熱備用”和我們平時接觸的磁盤陣列中的熱備作用類似,但是通過測試發現即使這里選擇了“熱備用”,存儲的容量大小并不會減少一個磁盤的容量(在選擇一個熱備盤的情況下),只是顯示活動的磁盤狀態是,選擇熱備的那塊盤狀態不是活動而已。
建議:推薦客戶使用IBM的3620,3650 HD等型號,或者HP的380 G8等服務器來安裝WSS 2012。另外,也建議,磁盤的陣列和熱備盤都在硬件層面上配置,這樣無論是性能還是可用性上都比較好。如果所有的磁盤都在一個陣列里面,在這一步中,顯示的物理磁盤就只有一個。
5、確認信息,無誤后,點擊“創建”
1、在存儲池界面,右鍵這里顯示的存儲池,選擇“新建虛擬磁盤”
2、點擊“下一步”
3、選擇存儲池,點擊下一步
4、輸入虛擬磁盤名稱
5、選擇存儲數據布局類型,如果已經在服務器層面上做了陣列,就直接選擇“simple”
6、選擇磁盤設置類型,有“精簡”和“固定”兩種
7、輸入虛擬磁盤的大小,這里有兩種方式,一個是指定大小,這種方式允許我們輸入的虛擬磁盤大小超過實際的物理容量,而且后期支持動態擴容,不影響、不中斷應用;另外一種是最大大小,物理實際容量多大就多大。
8、確認無誤,點擊“創建”
1、選擇其中一個pool,然后再虛擬磁盤的任務欄里對著其中一個虛擬磁盤右鍵,選擇新建卷
2、點擊“下一步”
3、點擊“下一步”
4、輸入卷的大小,這里要注意的是:卷的大小不能超過虛擬磁盤的大小,最大和虛擬磁盤的大小一樣
5、選擇磁盤符號
6、選擇文件系統格式,分配單元大小,卷標等
7、選擇是否設置重復數據刪除
8、確認無誤后,點擊創建
1、點擊“共享”,點擊下圖紅色框標注的地方
2、選擇NFS共享——高級,點擊“下一步”
3、選擇需要共享出去的卷
4、設置共享名稱,點擊“下一步”
5、選擇身份驗證,一般建議使用無服務器身份驗證即可,如下圖所示
6、設置共享權限,添加主機的IP,和共享權限,如下圖
7、添加好共享權限之后,點擊“下一步”
8、選擇文件夾權限
9、設置管理屬性
10、選擇是否應用配額設置
11、確定無誤后,點擊“創建”
12、現在驗證一下,看看能不能掛載剛剛新建的NFS共享卷,我們打開cmd,在cmd里輸入mount IP地址:/共享文件名 z:具體請參考以下截圖,卸載也是同樣的命令格式
2、選擇Iscsi虛擬磁盤位置
3、填寫iSCSI虛擬磁盤的名稱
4、填寫虛擬磁盤大小,這里要注意,只能填寫最大的大小為最大可用空間的大小
5、一般選擇新建Iscsi目標
6、填寫目標名稱
7、選擇添加
8、選擇:ip地址,輸入需要映射存儲的目標服務器的IP地址
9、點擊“下一步”
10、保持默認,點擊“下一步”
11、確認無誤,點擊“創建”
12、創建完成后,我們通過一臺win08 R2的服務器去驗證,具體如下:
13、映射成功,如下圖所示
14、此時你會發現,狀態已經處于“連接”
1、擴展存儲pool,該操作可在線進行,不影響應用正常使用