2014-02-07 73 views
0

我讀到有關從需要澄清編譯錯誤和運行時錯誤

Runtime vs Compile timeHow exactly does java compilation take place?

什麼,我可以推斷是,在編譯過程中,編譯器不運行時錯誤和編譯錯誤由零檢查邏輯,但只有語法和拼寫錯誤錯誤,其中在運行時的邏輯被選中,這些是如何實現等..像師,內存不夠的。

所以,如果我的理解是正確的,然後一個僅在編譯階段得到編譯錯誤和運行時僅在執行程序錯誤..

例如讓我考慮一個簡單的程序

public class Try { 

public static void main(String[] args) { 
    System.out.println("My first program"); 
    } 
} 

現在,當我在這個階段編譯(即javac)如果有任何錯誤產生,那麼這些錯誤稱爲編譯錯誤,在此期間檢查語法和錯字錯誤。

並且在將字節碼轉換爲本機/機器碼(e.e java)的過程中產生的錯誤稱爲運行時錯誤,在此期間檢查程序邏輯。

所以,只有在第二階段(即將字節碼轉換爲機器碼)執行和運行時錯誤開始時,纔會出現編譯錯誤。

請糾正我,如果我的理解是錯誤的...

+1

「僅在執行開始時編譯錯誤」 - 否 - 僅在編譯時。運行時錯誤 - 不 - 不轉換爲機器代碼 - 運行程序時出現邏輯錯誤 – Randy

+0

編譯器不僅僅是語法檢查。例如,它執行類型檢查,因此在執行之前發現許多邏輯錯誤。 – Ingo

回答

1

一個簡單的例子:

String myString = null; 
myString.substring(..) 

上面的代碼是在語法和類型而言是正確的,則編譯器顯示沒有錯誤。但是當你用這段代碼執行程序(運行程序)時,會有明顯的運行時錯誤。編譯器不夠聰明來檢測這些錯誤,如果你想在開發週期的早期捕獲這些錯誤(更好的方式是在你的客戶端執行該程序之前:P),有靜態分析工具或更好的自動測試工具。

+0

運行時錯誤只發生在我們運行程序時... 哦!不是在這個階段java 對不起,我不知道這個階段的名字...... – User27854

+0

也有編譯器會給出像這樣的結構警告(即做一定量的靜態分析),但這是一個好例子。 –

1

沒有,典型的Java虛擬機不字節碼轉換成機器代碼。創建的字節碼被解釋。

如果您編寫的程序從編程語言的角度來看是正確的(因此編譯),但它做了一些不起作用的運行時錯誤,例如,試圖用零除或者如果程序需要訪問只包含3個字符的字符串的第4個字符。

+0

「不,典型的Java虛擬機不會將字節碼轉換爲機器碼,所創建的字節碼會被解釋。」 解釋和轉換之間的區別是什麼.. – User27854

+0

編譯器創建「字節碼」,它是假想的虛擬機的代碼。 JVM可以模擬這臺機器(稱爲「解釋」字節碼),或者它可以使用即時編譯器(JIT)將其轉換爲本機代碼。 –

1

你的理解是錯誤的,但不是很大。錯誤的名稱幾乎表明它們的性質。

編譯時錯誤,當你編譯代碼出現。編譯意味着將文本轉換爲字節碼。這意味着你的java代碼不能被轉換成字節碼。編譯時錯誤通常會檢查語法,但Java編譯器也會執行一些非常基本的邏輯檢查。例如,它不允許您編譯具有不可達語句的代碼。

運行時錯誤,當你運行該程序時。這是JVM實際上試圖執行編譯的字節碼並遇到問題的時候。字節碼沒有直接轉換成機器碼的步驟。字節碼由JVM直接解釋。正如你所指出的那樣,這些問題可能是諸如除零和其他未定義的操作,內存耗盡,或者有時試圖將對象轉換爲非法類型。這些只是例子。任何阻止字節碼執行的東西都被認爲是運行時錯誤。

+0

「另外,沒有步驟將字節碼轉換爲機器碼。」 你打算糾正我說的字節碼被解釋..正確的! – User27854

+0

@ user2900314。從技術上講,有些方法可以將字節碼轉換爲機器碼,但通常不會使用它們,因爲它們消除了使Java非常有用的二進制可移植性。當您運行標準的JVM時,會解釋字節碼。 –

+0

最後,我還有一個問題給你... 只有當我們運行程序...編譯後發生運行時錯誤,即javac 我們得到一個類文件,並通過使用解釋器解釋爲本地/機器代碼(java )是不是這個階段叫做跑步.. – User27854