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