2012-02-27 161 views
29

在上ploymorphism我教授的幻燈片之一,我看到這一段代碼與一對夫婦的意見:運行時錯誤和編譯器錯誤有什麼區別?

discountVariable =    //will produce 
    (DiscountSale)saleVariable;//run-time error 
discountVariable = saleVariable //will produce 
           //compiler error 

正如你所看到的,它說,在第一次鑄造說法,這會產生運行 - 時間錯誤,在另一個它說它會產生編譯器錯誤

是什麼導致這些錯誤?以及它們如何彼此不同?

+28

加油吧。這傢伙正在努力學習,downvotes是不必要的。 – JohnFx 2012-02-27 20:35:54

+4

如果它解決了我的例子並不重要,真正重要的是我清楚地得到了答案。那個人用簡單的方式解釋了它,這對我這樣的天真的程序員來說很容易理解。 – AbdullahR 2012-02-27 20:54:58

+0

您是否閱讀過http://stackoverflow.com/faq? – 2012-02-27 21:00:55

回答

33

運行時錯誤。 這些是最困難的 - 並且會導致代碼中的程序崩潰和錯誤,這些錯誤很難追蹤到。

一個例子可能會試圖將一個字符串轉換:「你好」到一個整數:

string helloWorld = "hello"; 
int willThrowRuntimeError = Convert.ToInt32(helloWorld); 

編譯器可能不認爲這是一個問題,但運行時錯誤將被拋出。

編譯器錯誤是由於代碼中的錯誤,編譯器拋出錯誤以提醒您某些無法編譯的錯誤,因此無法運行。

編譯器錯誤的一個例子是:

int = "this is not an int"; 

希望有所幫助。

0

如果你使用谷歌,你會得到這樣的:

編譯時錯誤是防止Java程序編譯像一個語法錯誤,一類沒有發現任何類型的錯誤,一個錯誤的文件已定義類的名稱,混合不同java數據類型時可能會失去精度等等。

運行時錯誤是指在程序運行時發生的錯誤。爲了處理這種錯誤,java定義了Exceptions。異常是對象表示程序流程中的異常情況。它可以被選中或不選中。在程序的運行期間會發生

http://wiki.answers.com/Q/Difference_between_run_time_error_and_compile_time_error_in_java

+2

-1他沒有使用谷歌 - 他在這裏問。至少將你粘貼的文字粘貼到他的例子中。 – 2012-02-27 20:55:37

+0

現在使用Google鏈接... haha​​ – 2016-08-16 23:38:29

11

運行時錯誤。當您嘗試編譯代碼時發生編譯器錯誤。

如果您無法編譯您的代碼,那是編譯器錯誤。

如果您編譯並運行代碼,但在執行過程中失敗,那就是運行時。

+1

在您的示例中,「discountVariable」的聲明類型爲「DiscountSale」,「saleVariable」爲另一種類型。當您嘗試使用'discountVariable = saleVariable'行將另一個賦值給另一個時,這會導致編譯器錯誤。如果你把演員放在'(DiscountSale)'位置,這就告訴編譯器它沒問題。當它運行時它會中斷,因爲'saleVariable'實際上不是'DiscountSale'類型。 – 2012-02-27 20:52:51

+1

+1,因爲這是問題的最簡單的最佳答案:運行時錯誤和編譯器錯誤有什麼區別?但是,如果答案實際上解決了OP提供的具體示例,我會更加高興。 – 2012-02-27 20:54:34

1

它是因爲編譯器不知道「saleVariable」的對象類型,直到該程序運行時實際設置該值。

您正在將salesVariable中的所有內容強制轉換爲DiscountSale類型,這被認爲是不安全的,並且只有在運行時才能被評估。

+0

不是+1,因爲「編譯器不知道saleVariable的對象類型」。這不是真的。編譯器知道這種類型 - 它只是與DiscountSale不兼容。 – 2012-02-27 20:57:27

+0

你的權利,我只是想在這個背景下,如果他在晚會上做了類似e.DataItem – bigamil 2012-02-28 14:27:00

2

編譯時錯誤意味着編譯器知道discountVariable = saleVariable必須以分號結尾,如下所示discountVariable = saleVariable;因此編譯代碼時會引發錯誤。

運行時錯誤意味着錯誤將在運行時發生,因爲即使您將saleVariable轉換爲discountVariable,由於類型不同,轉換也無法執行。

5

編譯時間錯誤引用語法和語義。例如,如果您執行涉及不同類型的操作。例如:用int添加一個字符串,或者用一個真正的字符串來分隔字符串。 (請閱讀最後一段!!!)

運行時錯誤是在程序執行時檢測到的那些錯誤。例如,除以零。編譯器無法知道操作x/a-b是否會導致除以0直到執行。

這是一個很的解釋。有許多智能編譯器,並且還可以在不同類型中進行內部鑄造,從而實現有意義的操作。即使代碼未執行,也可以預編譯代碼並查看一些運行時錯誤

參考此鏈接太:當代碼實際運行時,纔會發生Runtime vs Compile time

1

認爲你已經得到了有什麼區別的一般說明。特別是在你的代碼顯示在OP,

  • 在第二份聲明,編譯器就比較LHS和RHS的類型,發現沒有隱式轉換可能因此它給人的錯誤。
  • 編譯器認爲第一條語句是相同的,但是這裏程序員明確地轉換了類型,這跟告訴編譯器一樣好,我知道我在做什麼,當然編譯器信任你並且不會給你任何錯誤。
+0

+1的事情,但這很有幫助 – 2012-02-27 20:56:16

0

編譯器錯誤是由於代碼中的不準確,編譯器拋出錯誤以提醒您某些不會編譯的內容,因此無法運行。

例如: - MethodOverloading

class OverloadingTest { 
    void sum(int a, long b) { 
     System.out.println("a method invoked"); 
    } 

    void sum(long a, int b) { 
     System.out.println("b method invoked"); 
    } 

    public static void main(String args[]) { 
     OverloadingTest obj = new OverloadingTest(); 
     obj.sum(200, 200);// now ambiguity 
    } 
} 

運行時間錯誤是那些程序執行時被檢測到。例如,除以零。編譯器無法知道如果操作X/AB將導致除以零,直到執行

0

編譯/編譯時間/語法/語義錯誤:編譯或編譯時錯誤的發生是由於打字錯誤錯誤,如果我們不遵循任何編程語言的正確語法和語義,然後編譯器會拋出編譯時錯誤。他們不會讓你的程序執行一行代碼,直到你刪除了所有的語法錯誤,或者直到你調試了編譯時錯誤。
示例:缺少C中的分號或模糊intInt

運行時錯誤:運行時錯誤是程序處於運行狀態時生成的錯誤。這些類型的錯誤將導致您的程序意外行爲,甚至可能會導致程序死機。他們通常被稱爲例外。
示例:假設您正在讀取一個不存在的文件,將導致運行時錯誤。

瞭解更多關於這裏所有programming errors

2

編譯時錯誤的語法和語義錯誤。

運行時錯誤主要是邏輯錯誤。由於程序員忽略了某些東西,程序崩潰了,例如除以0,訪問變量而不初始化它等。

相關問題