試是所有Java程序員的必備技能。本文將從初學(xué)者指南開始,幫助程序員學(xué)習(xí)調(diào)試。在本文的第二部分,你還可以看到有關(guān)新版Eclipse Oxygen中如何調(diào)試的講解。
調(diào)試是從程序中定位和刪除bug或異常的常規(guī)過程。對(duì)于Java程序員來說,這是一個(gè)必須具備的技能,因?yàn)樗兄谡业皆诖a審查過程中不可見的微妙錯(cuò)誤,或者僅在特定情況下發(fā)生的錯(cuò)誤。Eclipse Java IDE在“Debug Perspective”選項(xiàng)下提供了許多調(diào)試工具和視圖,可幫程序員高效調(diào)試。
初學(xué)者指南——快速啟動(dòng)調(diào)試
以下是一些快速提示和工具,可幫助程序員快速開始調(diào)試Java項(xiàng)目。
1.啟動(dòng)和調(diào)試Java程序
可以通過從Package Explorer中右鍵單擊Java編輯器類文件來簡(jiǎn)單地調(diào)試Java程序。 選擇Debug As→Java Application,或者使用Alt + Shift + D,J代替快捷方式。
在大多數(shù)情況下,用戶可以在調(diào)試時(shí)編輯和保存代碼,而無需重新啟動(dòng)程序。這適用于HCR(熱代碼替換)支持,HCR已被特別添加為標(biāo)準(zhǔn)Java技術(shù),以促進(jìn)實(shí)驗(yàn)開發(fā)并促進(jìn)迭代。
2.斷點(diǎn)
斷點(diǎn)是一個(gè)信號(hào),告訴調(diào)試器在代碼中的某一點(diǎn)暫時(shí)中止程序的執(zhí)行。
要在源代碼中定義斷點(diǎn),請(qǐng)右鍵單擊Java編輯器中的左邊距,然后選擇切換斷點(diǎn)。或者,您可以雙擊此位置。“斷點(diǎn)”視圖允許程序員刪除和停用斷點(diǎn)并修改其屬性。
所有斷點(diǎn)可以使用跳過所有斷點(diǎn)啟用/禁用。斷點(diǎn)也可以導(dǎo)入/導(dǎo)出到工作區(qū)。
3. Debug perspective
debug perspective提供了可用于對(duì)斷點(diǎn),變量,調(diào)試,控制臺(tái)等進(jìn)行故障排除的其他視圖。當(dāng)在調(diào)試模式下啟動(dòng)Java程序時(shí),會(huì)提示用戶切換到debug perspective。
debug perspective - 可視化調(diào)用堆棧并提供操作。
Breakpoints view - 顯示所有斷點(diǎn)。
Variables/Expression view - 顯示聲明的變量及其值。在選定的變量或表達(dá)式上按Ctrl + Shift + d或Ctrl + Shift + i顯示其值。您還可以在表達(dá)式/變量上添加永久性表,然后在調(diào)試開啟時(shí),將在“表達(dá)式”視圖中顯示。
Display view - 允許在調(diào)試期間檢查變量,表達(dá)式或所選文本的值。
Console view - 程序輸出如下所示。
4.按步驟調(diào)試
Eclipse Platform通過在工具欄中提供按鈕和快捷鍵的方式來幫助程序員進(jìn)行調(diào)試,以控制程序的執(zhí)行。
調(diào)試復(fù)雜場(chǎng)景的高級(jí)工具
本節(jié)將為您提供更多高級(jí)提示和技巧,以調(diào)試Java項(xiàng)目。Eclipse Oxygen版本包含許多Java調(diào)試的極大改進(jìn)。
1、觀察點(diǎn),異常斷點(diǎn),條件斷點(diǎn)
觀察點(diǎn) - 觀察點(diǎn)是特定的斷點(diǎn),只要給定表達(dá)式/字段的值發(fā)生更改,而不指定可能發(fā)生的位置,就會(huì)停止應(yīng)用程序的執(zhí)行。 用戶可以通過“斷點(diǎn)屬性”...指定監(jiān)視表達(dá)式被訪問,修改或同時(shí)停止執(zhí)行。
異常斷點(diǎn) - 使用添加Java異常斷點(diǎn)指定拋出異常的斷點(diǎn)。NullPointerException的斷點(diǎn)將在每次拋出此異常時(shí)停止。
條件斷點(diǎn) - Eclipse用戶可以創(chuàng)建條件來限制斷點(diǎn)的激活。
只有當(dāng)布爾值b為真時(shí),才會(huì)激活斷點(diǎn)。可以提供命中計(jì)數(shù)以在斷點(diǎn)的第n個(gè)命中停止執(zhí)行。斷點(diǎn)被禁用,直到它被重新啟用或其命中計(jì)數(shù)更改或程序結(jié)束為止。
2.遠(yuǎn)程調(diào)試
Eclipse IDE允許程序員調(diào)試在另一個(gè)Java虛擬機(jī)(JVM)上甚至另一臺(tái)機(jī)器上運(yùn)行的應(yīng)用程序。要啟用遠(yuǎn)程調(diào)試,需要啟動(dòng)具有某些標(biāo)志的Java應(yīng)用程序。連接類型可以指定為Socket Attach或Socket Listen。Socket Listen支持多個(gè)傳入連接。
Eclipse Oxygen的新功能
以下是添加到Eclipse Java IDE版本中的新功能。
追蹤點(diǎn)
Eclipse平臺(tái)中的一個(gè)新功能,允許用戶創(chuàng)建條件斷點(diǎn)來打印消息,而不會(huì)在斷點(diǎn)處停止并使代碼塊混亂。
Eclipse Platform使用systrace模板創(chuàng)建了tracepoint。
觸發(fā)點(diǎn)
程序員可激活觸發(fā)點(diǎn),為工作區(qū)中的斷點(diǎn)定義一組觸發(fā)點(diǎn)。觸發(fā)器最初被抑制的所有其他斷點(diǎn)只有在觸發(fā)點(diǎn)被觸發(fā)之后才會(huì)被擊中。觸發(fā)點(diǎn)被觸發(fā)后,所有的觸發(fā)器被禁用,并且在運(yùn)行后將被重新啟用。
通過使用斷點(diǎn)屬性,可以通過“斷點(diǎn)”視圖的對(duì)話框或詳細(xì)信息窗格將任何斷點(diǎn)設(shè)置為觸發(fā)點(diǎn)。
邏輯結(jié)構(gòu)
在 Variables view中,集合對(duì)象直接顯示其包含的元素,而不是其內(nèi)部結(jié)構(gòu)。默認(rèn)情況下,在Oxygen釋放中激活邏輯結(jié)構(gòu),可以關(guān)閉顯示邏輯結(jié)構(gòu)以顯示內(nèi)部結(jié)構(gòu)。
顯示邏輯結(jié)構(gòu)上下文菜單允許程序員創(chuàng)建,選擇或編輯表示。
步驟操作后的方法結(jié)果
在調(diào)試過程中,在“進(jìn)入”,“逐步”或“返回”期間觀察到的最后一個(gè)方法的結(jié)果(每次返回或拋出)在“變量”視圖中顯示為第一行。
啟動(dòng)組
啟動(dòng)組在Oxygen中也是新增功能,啟動(dòng)組啟動(dòng)配置類型允許按順序啟動(dòng)多個(gè)其他配置,并在啟動(dòng)每個(gè)組成員后執(zhí)行可配置的操作。可以通過運(yùn)行→運(yùn)行配置...或運(yùn)行→調(diào)試配置...對(duì)話框創(chuàng)建新的啟動(dòng)組。
斷點(diǎn)分組和排序
Eclipse用戶現(xiàn)在可以根據(jù)Eclipse Oxygen中的不同類別對(duì)斷點(diǎn)進(jìn)行分組。斷點(diǎn)工作集定義了一組斷點(diǎn)。用戶可以在工作集上執(zhí)行啟用/禁用操作。
、Eclipse的基本認(rèn)識(shí):Eclipse是Java以及JavaEE開發(fā)的IDE(integreated Development Environment,集成開發(fā)環(huán)境)之一,是目前軟件企業(yè)使用最多的一種IDE。Ecplise最初是IBM的產(chǎn)品,在2001年交給了開源組織來維護(hù),現(xiàn)在是非盈利組織Eclipse基金會(huì)(Ecplise Foundation)來管理。
- 下載在官網(wǎng)www.eclipse.org中下載。(Eclipse的安裝很簡(jiǎn)單,直接解壓下載的壓縮文件即可。)
2、Eclipse基本設(shè)置(Window -> Preferences)
- 工作環(huán)境下的字符編碼的設(shè)置:(一般設(shè)置為utf-8,否則按照默認(rèn)的gbk在進(jìn)行web編程時(shí)會(huì)出現(xiàn)亂碼的問題)
- JRE設(shè)置:如果在系統(tǒng)環(huán)境變量中設(shè)置了JAVA_HOME,則會(huì)默認(rèn)使用JAVA_HOME的設(shè)置。
- 編譯器設(shè)置:
- 默認(rèn)Web瀏覽器配置:默認(rèn)情況下,Ecplise使用的是內(nèi)部瀏覽器,但也可以指定為外部瀏覽器。
- 添加外部瀏覽器:
- 修改JSP、HTML文件的默認(rèn)字符編碼:
- HTML的字符編碼格式默認(rèn)為utf-8:
2、Eclipse文件相關(guān)常用的快捷鍵:
- Ctrl + N:新建一個(gè)工程、文件、文件夾等內(nèi)容。
- Ctrl + M:窗口最大化/還原。
- Alt + Enter:打開被選中的工程、包、文件等的屬性窗口。
- Ctrl + F11:以調(diào)試模式運(yùn)行程序。
- F2:重命名工程名、文件名。
- Ctrl + E:打開編輯窗口查看目錄。
- Ctrl + Page Up:切換到當(dāng)前編輯窗口的上一個(gè)窗口。
- Ctrl + Page Down:切換到當(dāng)前編輯窗口的下一個(gè)窗口。
3、Eclipse編寫代碼時(shí)常用的快捷鍵:
- Ctrl + Alt + 向下的箭頭:向下賦值光標(biāo)所在行內(nèi)容或者選中內(nèi)容。
- Ctrl + Alt + 向上的箭頭:向上賦值光標(biāo)所在行內(nèi)容或者選中內(nèi)容。
- Alt + 向下的箭頭:向下移動(dòng)光標(biāo)所在行內(nèi)容或者選中內(nèi)容。
- Alt + 向上的箭頭:向上移動(dòng)光標(biāo)所在行內(nèi)容或者選中內(nèi)容。
- Ctrl + 1: 給出解決方案。
- Alt + ?:顯示自動(dòng)提示功能。
- Alt + Shift + Z:對(duì)選中代碼進(jìn)行Surrount With。
- Alt + Shift + S:彈出Source菜單。(彈出菜單后,根據(jù)顯示的字母下劃線提示選擇)
- Ctrl + /:行注釋與解除注釋。
- Ctrl + Shift + /:塊注釋。
- Ctrl + Shift + \:解除塊注釋。
- Ctrl + Shift + F:格式化代碼。
- Alt + Shift + L:將選中內(nèi)容抽取為變量。
- Alt + Shift + M:將選中內(nèi)容抽取為方法。
4、Eclipse打印輸出結(jié)果:
a、選中要打印的內(nèi)容;b、Alt + ?,彈出幫助信息;c、按向上箭頭一下,然后按下enter鍵即可。
5、Eclipse查看源碼時(shí)常用的快捷鍵:
- Ctrl + T:查看類的繼承關(guān)系、實(shí)現(xiàn)關(guān)系。
- Ctrl + O:查看類的結(jié)構(gòu)。
- Ctrl + Shift + T:打開查看類窗口。
- 查看類或者方法的定義:鼠標(biāo)懸浮在類或者方法上,同時(shí)按下Ctrl鍵。(顯示下劃線后單擊即可進(jìn)入類或者方法的定義)
6、Eclipse其他快捷鍵:
- Ctrl + Shift + 向左箭頭或者向右箭頭:快速選擇一個(gè)單詞。
- Shift + Home 或者是 End:從光標(biāo)當(dāng)前位置,快速選擇到行首或者行尾。
- Shift + 向上箭頭或者向下箭頭:從光標(biāo)當(dāng)前位置,快速選擇到上一行或者下一行。
者:為了美好的明天
來源:https://javapapers.com/core-java/system-out-println/
什么是System.out.println()
System.out.println是一個(gè)Java語句,一般情況下是將傳遞的參數(shù),打印到控制臺(tái)。
System:是 java.lang包中的一個(gè)final類。
根據(jù) javadoc,“java.lang.System該類提供的設(shè)施包括標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出和錯(cuò)誤輸出流; 訪問外部定義的屬性和環(huán)境變量; 一種加載文件和庫(kù)的方法; 以及用于快速?gòu)?fù)制數(shù)組等一部分的實(shí)用方法… ”
out:是System類的靜態(tài)成員字段,類型為PrintStream。
public static final PrintStream out
他在啟動(dòng)時(shí)就會(huì)被實(shí)例化,并與主機(jī)的標(biāo)準(zhǔn)輸出控制臺(tái)進(jìn)行映射。該流在實(shí)例化之后立即打開,并準(zhǔn)備接受數(shù)據(jù)。
println:是PrintStream類的一個(gè)方法。println打印(參數(shù)內(nèi)容+換行符) 到控制臺(tái)。
PrintStream類中有多個(gè)重載的println方法。每個(gè)println是通過調(diào)用print方法并添加一個(gè)換行符實(shí)現(xiàn)的。print方法是通過調(diào)用write方法實(shí)現(xiàn)的。
System.out.println() 結(jié)構(gòu)圖如下:
以下是JDK源中System.out.println的骨架結(jié)構(gòu),和代碼片段。
部分代碼段:
public final class System { static PrintStream out; static PrintStream err; static InputStream in; ... } public class PrintStream extends FilterOutputStream { //out object is inherited from FilterOutputStream class public void println() { ... }
out對(duì)象可以自定義的。在啟動(dòng)時(shí)由java運(yùn)行時(shí)環(huán)境初始化,并且可以在執(zhí)行期間由開發(fā)人員更改。代替在默認(rèn)情況下的標(biāo)準(zhǔn)輸出。
當(dāng)您通過命令行運(yùn)行程序時(shí),輸出將打印在同一個(gè)命令窗口中。我們可以使用setOut方法來改變這種行為。
在以下示例中,我將輸出重定向到同一目錄中的文本文件。
public class ChangeOut { public static void main(String args[]) { try { System.setOut(new PrintStream(new FileOutputStream("log.txt"))); System.out.println("Now the output is redirected!"); } catch(Exception e) {} } }
有一個(gè)普遍的觀念需要大家知道——System.out.println性能并不好。
當(dāng)我們深入分析時(shí),其調(diào)用順序如下println - > print - > write()+ newLine()。這個(gè)順序流是Sun / Oracle JDK的實(shí)現(xiàn)。
write()和newLine()都包含一個(gè)synchronized塊。同步有一點(diǎn)開銷,但更多的是添加字符到緩沖區(qū)和打印的開銷更大。
當(dāng)我們運(yùn)行性能分析時(shí),運(yùn)行多個(gè)System.out.println并記錄時(shí)間,執(zhí)行時(shí)間會(huì)按比例增加。當(dāng)打印超過50個(gè)字符并打印超過50,000行時(shí),性能下降。
當(dāng)然這一切都取決于我們使用的場(chǎng)景。不過無論如何請(qǐng)勿使用System.out.println打印日志( logging)到stdout。
Log4J具有多種記錄級(jí)別。如果我們正在編寫一個(gè)小程序,只是為了實(shí)驗(yàn)/學(xué)習(xí)目的那么使用 System.out.println 就很不錯(cuò)。
但當(dāng)我們開發(fā)生產(chǎn)質(zhì)量軟件時(shí),我們應(yīng)該注意到應(yīng)該使用記錄組件(log4j等),并且應(yīng)該避免使用System.out.println。為什么?
所以我們不應(yīng)該使用System.out.println進(jìn)行日志記錄和調(diào)試(logging and debugging)
有時(shí)我們覺得System.out.println是一個(gè)很長(zhǎng)的語句要打印。靜態(tài)導(dǎo)入可能會(huì)縮短一點(diǎn),但不推薦使用,因?yàn)樗鼘?dǎo)致可讀性差。
我只是使用這種情況來解釋靜態(tài)導(dǎo)入,并避免在下面的情況下使用它。
import static java.lang.System.out; public class ShortSOP { public static void main(String[] args) { out.println("Hello, world"); } }
不靜態(tài)導(dǎo)入的話直接寫out.println會(huì)提示編譯錯(cuò)誤的。
作為相關(guān)部分,接下來介紹一下“err”和“in”。'in'與InputStream相關(guān)聯(lián)。與“out”相對(duì),“in”用于從標(biāo)準(zhǔn)控制臺(tái)通用鍵盤獲取輸入。
'err'與PrintStream相關(guān)聯(lián),并將參數(shù)打印到標(biāo)準(zhǔn)錯(cuò)誤輸出流。當(dāng)您使用eclipse等的IDE時(shí),可以看到“out”和“err”之間的輸出差異。
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。