當前位置:首頁 » 編程軟體 » 編譯時異常為什麼需要處理

編譯時異常為什麼需要處理

發布時間: 2022-06-27 22:18:15

1. java中異常類的作用為什麼要進行異常處理,有什麼好處

1)java異常類作用太大了,是最重要的幾個類之一,你想得到的錯誤,那裡面都有,你想不到的,他也有,當然不包括業務邏輯錯誤!
2)不進行異常處理程序就是中斷運行,比如你用QQ,突然出異常,QQ就關掉了,你會怎麼想?
3)出現異常就別想什麼好處了,趕緊解決才對!沒有人說他的程序無異常,一個輸出語句那種程序就別提了!

2. JAVA中為何要進行異常處理

不只是JAVA,一般編程都需要進行異常處理,是為了方便查錯,因為有異常在調試時可以從程序中查看異常來源,或者可以在處理異常時,獲取錯誤的原因,這是需要養成良好的習慣

3. 編程中為什麼需要異常處理

1 引子 try…catch…finally恐怕是大家再熟悉不過的語句了,而且感覺用起來也是很簡單,邏輯上似乎也是很容易理解。不過,我親自體驗的「教訓」告訴我,這個東西可不是想像中的那麼簡單、聽話。不信?那你看看下面的代碼,「猜猜」它執行後的結果會是什麼?不要往後看答案、也不許執行代碼看真正答案哦。如果你的答案是正確,那麼這篇文章你就不用浪費時間看啦。 package myExample.testException; public class TestException { public TestException() { } boolean testEx() throws Exception{ boolean ret = true; try{ ret = testEx1(); }catch (Exception e){ System.out.println("testEx, catch exception"); ret = false; throw e; }finally{ System.out.println("testEx, finally; return value="+ret); return ret; } } boolean testEx1() throws Exception{ boolean ret = true; try{ ret = testEx2(); if (!ret){ return false; } System.out.println("testEx1, at the end of try"); return ret; }catch (Exception e){ System.out.println("testEx1, catch exception"); ret = false; throw e; } finally{ System.out.println("testEx1, finally; return value="+ret); return ret; } } boolean testEx2() throws Exception{ boolean ret = true; try{ int b=12; int c; for (int i=2;i>=-2;i--){ c=b/i; System.out.println("i="+i); } return true; }catch (Exception e){ System.out.println("testEx2, catch exception"); ret = false; throw e; } finally{ System.out.println("testEx2, finally; return value="+ret); return ret; } } public static void main(String[] args) { TestException testException1 = new TestException(); try{ testException1.testEx(); }catch(Exception e){ e.printStackTrace(); } } } 你的答案是什麼?是下面的答案嗎? i=2 i=1 testEx2, catch exception testEx2, finally; return value=false testEx1, catch exception testEx1, finally; return value=false testEx, catch exception testEx, finally; return value=false 如果你的答案真的如上面所說,那麼你錯啦。^_^,那就建議你仔細看一看這篇文章或者拿上面的代碼按各種不同的情況修改、執行、測試,你會發現有很多事情不是原來想像中的那麼簡單的。 現在公布正確答案: i=2 i=1 testEx2, catch exception testEx2, finally; return value=false testEx1, finally; return value=false testEx, finally; return value=false 2 基礎知識 2.1 相關概念 例外是在程序運行過程中發生的異常事件,比如除0溢出、數組越界、文件找不到等,這些事件的發生將阻止程序的正常運行。為了加強程序的魯棒性,程序設計時,必須考慮到可能發生的異常事件並做出相應的處理。C語言中,通過使用if語句來判斷是否出現了例外,同時,調用函數通過被調用函數的返回值感知在被調用函數中產生的例外事件並進行處理。全程變數ErroNo常常用來反映一個異常事件的類型。但是,這種錯誤處理機制會導致不少問題。 Java通過面向對象的方法來處理例外。在一個方法的運行過程中,如果發生了例外,則這個方法生成代表該例外的一個對象,並把它交給運行時系統,運行時系統尋找相應的代碼來處理這一例外。我們把生成例外對象並把它提交給運行時系統的過程稱為拋棄(throw)一個例外。運行時系統在方法的調用棧中查找,從生成例外的方法開始進行回朔,直到找到包含相應例外處理的方法為止,這一個過程稱為捕獲(catch)一個例外。 2.2 Throwable類及其子類 用面向對象的方法處理例外,就必須建立類的層次。類 Throwable位於這一類層次的最頂層,只有它的後代才可以做為一個例外被拋棄。圖1表示了例外處理的類層次。 從圖中可以看出,類Throwable有兩個直接子類:Error和Exception。Error類對象(如動態連接錯誤等),由Java虛擬機生成並拋棄(通常,Java程序不對這類例外進行處理);Exception類對象是Java程序處理或拋棄的對象。它有各種不同的子類分別對應於不同類型的例外。其中類RuntimeException代表運行時由Java虛擬機生成的例外,如算術運算例外ArithmeticException(由除0錯等導致)、數組越界例外等;其它則為非運行時例外,如輸入輸出例外IOException等。Java編譯器要求Java程序必須捕獲或聲明所有的非運行時例外,但對運行時例外可以不做處理。 圖1 例外處理的類層次 2.3 異常處理關鍵字 Java的異常處理是通過5個關鍵字來實現的:try,catch,throw,throws,finally。JB的在線幫助中對這幾個關鍵字是這樣解釋的: Throws: Lists the exceptions a method could throw. Throw: Transfers control of the method to the exception handler. Try: Opening exception-handling statement. Catch: Captures the exception. Finally: Runs its code before terminating the program. 2.3.1 try語句 try語句用大括弧{}指定了一段代碼,該段代碼可能會拋棄一個或多個例外。 2.3.2 catch語句 catch語句的參數類似於方法的聲明,包括一個例外類型和一個例外對象。例外類型必須為Throwable類的子類,它指明了catch語句所處理的例外類型,例外對象則由運行時系統在try所指定的代碼塊中生成並被捕獲,大括弧中包含對象的處理,其中可以調用對象的方法。 catch語句可以有多個,分別處理不同類的例外。Java運行時系統從上到下分別對每個catch語句處理的例外類型進行檢測,直到找到類型相匹配的catch語句為止。這里,類型匹配指catch所處理的例外類型與生成的例外對象的類型完全一致或者是它的父類,因此,catch語句的排列順序應該是從特殊到一般。 也可以用一個catch語句處理多個例外類型,這時它的例外類型參數應該是這多個例外類型的父類,程序設計中要根據具體的情況來選擇catch語句的例外處理類型。 2.3.3 finally語句 try所限定的代碼中,當拋棄一個例外時,其後的代碼不會被執行。通過finally語句可以指定一塊代碼。無論try所指定的程序塊中拋棄或不拋棄例外,也無論catch語句的例外類型是否與所拋棄的例外的類型一致,finally所指定的代碼都要被執行,它提供了統一的出口。通常在finally語句中可以進行資源的清除工作。如關閉打開的文件等。 2.3.4 throws語句 throws總是出現在一個函數頭中,用來標明該成員函數可能拋出的各種異常。對大多數Exception子類來說,Java 編譯器會強迫你聲明在一個成員函數中拋出的異常的類型。如果異常的類型是Error或 RuntimeException, 或它們的子類,這個規則不起作用, 因為這在程序的正常部分中是不期待出現的。 如果你想明確地拋出一個RuntimeException,你必須用throws語句來聲明它的類型。 2.3.5 throw語句 throw總是出現在函數體中,用來拋出一個異常。程序會在throw語句後立即終止,它後面的語句執行不到,然後在包含它的所有try塊中(可能在上層調用函數中)從里向外尋找含有與其匹配的catch子句的try塊。 3 關鍵字及其中語句流程詳解 3.1 try的嵌套 你可以在一個成員函數調用的外面寫一個try語句,在這個成員函數內部,寫另一個try語句保護其他代碼。每當遇到一個try語句,異常的框架就放到堆棧上面,直到所有的try語句都完成。如果下一級的try語句沒有對某種異常進行處理,堆棧就會展開,直到遇到有處理這種異常的try語句。下面是一個try語句嵌套的例子。 class MultiNest { static void procere() { try { int a = 0; int b = 42/a; } catch(java.lang.ArithmeticException e) { System.out.println("in procere, catch ArithmeticException: " + e); } } public static void main(String args[]) { try { procere(); } catch(java.lang. Exception e) { System.out.println("in main, catch Exception: " + e); } } } 這個例子執行的結果為: in procere, catch ArithmeticException: java.lang.ArithmeticException: / by zero 成員函數procere里有自己的try/catch控制,所以main不用去處理 ;當然如果如同最開始我們做測試的例子一樣,在procere中catch到異常時使用throw e;語句將異常拋出,那麼main當然還是能夠捕捉並處理這個procere拋出來的異常。例如在procere函數的catch中的System.out語句後面增加throw e;語句之後,執行結果就變為: in procere, catch ArithmeticException: java.lang.ArithmeticException: / by zero in main, catch Exception: java.lang.ArithmeticException: / by zero 3.2 try-catch程序塊的執行流程以及執行結果 相對於try-catch-finally程序塊而言,try-catch的執行流程以及執行結果還是比較簡單的。 首先執行的是try語句塊中的語句,這時可能會有以下三種情況: 1. 如果try塊中所有語句正常執行完畢,那麼就不會有其他的「動做」被執行,整個try-catch程序塊正常完成。 2. 如果try語句塊在執行過程中碰到異常V,這時又分為兩種情況進行處理: �0�5 如果異常V能夠被與try相應的catch塊catch到,那麼第一個catch到這個異常的catch塊(也是離try最近的一個與異常V匹配的catch塊)將被執行;如果catch塊執行正常,那麼try-catch程序塊的結果就是「正常完成」;如果該catch塊由於原因R突然中止,那麼try-catch程序塊的結果就是「由於原因R突然中止(completes abruptly)」。 �0�5 如果異常V沒有catch塊與之匹配,那麼這個try-catch程序塊的結果就是「由於拋出異常V而突然中止(completes abruptly)」。 3. 如果try由於其他原因R突然中止(completes abruptly),那麼這個try-catch程序塊的結果就是「由於原因R突然中止(completes abruptly)」。 3.3 try-catch-finally程序塊的執行流程以及執行結果 try-catch-finally程序塊的執行流程以及執行結果比較復雜。 首先執行的是try語句塊中的語句,這時可能會有以下三種情況: 1. 如果try塊中所有語句正常執行完畢,那麼finally塊的居於就會被執行,這時分為以下兩種情況: �0�5 如果finally塊執行順利,那麼整個try-catch-finally程序塊正常完成。 �0�5 如果finally塊由於原因R突然中止,那麼try-catch-finally程序塊的結局是「由於原因R突然中止(completes abruptly)」 2. 如果try語句塊在執行過程中碰到異常V,這時又分為兩種情況進行處理: �0�5 如果異常V能夠被與try相應的catch塊catch到,那麼第一個catch到這個異常的catch塊(也是離try最近的一個與異常V匹配的catch塊)將被執行;這時就會有兩種執行結果: �0�5 如果catch塊執行正常,那麼finally塊將會被執行,這時分為兩種情況: �0�5 如果finally塊執行順利,那麼整個try-catch-finally程序塊正常完成。 �0�5 如果finally塊由於原因R突然中止,那麼try-catch-finally程序塊的結局是「由於原因R突然中止(completes abruptly)」 �0�5 如果catch塊由於原因R突然中止,那麼finally模塊將被執行,分為兩種情況: �0�5 如果如果finally塊執行順利,那麼整個try-catch-finally程序塊的結局是「由於原因R突然中止(completes abruptly)」。 �0�5 如果finally塊由於原因S突然中止,那麼整個try-catch-finally程序塊的結局是「由於原因S突然中止(completes abruptly)」,原因R將被拋棄。 (注意,這里就正好和我們的例子相符合,雖然我們在testEx2中使用throw e拋出了異常,但是由於testEx2中有finally塊,而finally塊的執行結果是complete abruptly的(別小看這個用得最多的return,它也是一種導致complete abruptly的原因之一啊——後文中有關於導致complete abruptly的原因分析),所以整個try-catch-finally程序塊的結果是「complete abruptly」,所以在testEx1中調用testEx2時是捕捉不到testEx1中拋出的那個異常的,而只能將finally中的return結果獲取到。 如果在你的代碼中期望通過捕捉被調用的下級函數的異常來給定返回值,那麼一定要注意你所調用的下級函數中的finally語句,它有可能會使你throw出來的異常並不能真正被上級調用函數可見的。當然這種情況是可以避免的,以testEx2為例:如果你一定要使

4. 11.錯誤和異常有什麼區別,為什麼要進行異常

異常: 在Java中程序的錯誤主要是語法錯誤和語義錯誤,一個程序在編譯和運行時出現的錯誤我們統一稱之為異常,它是VM(虛擬機)通知你的一種方式,通過這種方式,VM讓你知道,你(開發人員)已經犯了個錯誤,現在有一個機會來修改它。Java中使用異常類來表示異常,不同的異常類代表了不同的異常。但是在Java中所有的異常都有一個基類,叫做Exception。
錯誤:它指的是一個合理的應用程序不能截獲的嚴重的問題。大多數都是反常的情況。」,錯誤是VM的一個故障(雖然它可以是任何系統級的服務)。所以,錯誤是很難處理的,一般的開發人員(當然不是你)是無法處理這些錯誤的。比如內存溢出;
和異常一樣,在Java中用錯誤類來表示錯誤,不同的錯誤類代表了不同的錯誤。
但是在Java中所有的錯誤都有一個基類,叫做Error。
綜上,我們可以知道異常和錯誤最本質的區別就是異常能被開發人員處理而錯誤時系統本來自帶的,一般無法處理也不需要我們程序員來處理。

5. Java為什麼要採用異常處理機制

在可能會出現exception的地方,要使用try-catch或者throws或者兩者都要。我的判斷依據是:如果對可能出現的exception不想被外部(方法的調用者)知道,就在方法內部try-catch掉這個exception;如果希望外部知道,則在catch到之後把exception直接拋出或者拋出自定義的exception。 一、異常的種類java異常可以分成兩大類:Exception和RuntimeException(雖然RuntimeException是從Exception繼承的)。exception異常代表「無法避免的異常」 如io異常 往往這類異常是由於外部原因造成的,程序本身無法保證他們不發生,所以這類異常必須捕獲。如果在函數內部無法處理這個異常必須再次拋出(在函數後面用throws語句),如果什麼都不做就出現編譯錯誤。runtimexception是指「可以避免的異常」,如 null引用異常,這類異常都是由程序內部原因造成的,是可以避免的。對於這類異常可以忽略他們,但一旦發生程序就會異常終止。這類異常對debug非常有幫助,當然,如果需要也可以catch。另外,有些地方即使不會有exception,但是從商業邏輯上是錯誤的、非預期的,也可以拋出user exception。例如,用戶輸入非法,bank account非法透支等等。二、主要原則處理意外的一個重要原則,就是要麼處理,要麼接著拋,決不能吃掉(You either handle it, or throw it. You don』t eat it.)這就是說,當你捕獲一個異常之後,必須決定是否立即處理這個異常,或者繼續拋出這個異常(或者另一個自定義異常),以便由調用的客戶端捕獲之。當客戶端捕獲到以後,又會繼續進行類似的判斷。一般來說,GUI端是要處理異常的,比如JSP捕獲到異常之後,需要先是給用戶一個友好的出錯信息,而不要給出系統的出錯信息。系統的出錯信息一方面不太友好,另一方面提供了太多的系統信息,容易被惡意用戶用來攻擊系統。換句話說,所有的異常最終必須有一個終極的處理者,這就是GUI。至於中間的環節,比如在伺服器端運行的JavaBean是否要處理捕獲到的異常,還是繼續拋出所捕獲的異常,需要視具體情況處理。除非你想把異常處理的責任交給調用者,一般不用throws。 比如你要讀入一些文件,如果你想通知調用者,讓調用者決定如何處理這個異常,你就把這個異常throws給調用者;如果你知道應該如何處理這個異常,或者你想把異常馬上解決,你可以就地catch她。這完全取決於你想把異常自己立即處理還是想把處理責任返回給調用者。取決於你的程序的結構和要求。需要注意的有:1、如果無法處理某個異常,那就不要捕獲它。2、如果捕獲了一個異常,請不要胡亂處理它。3、盡量在靠近異常被拋出的地方捕獲異常。4、在捕獲異常的地方將它記錄到日誌中,除非您打算將它重新拋出。5、按照您的異常處理必須多精細來構造您的方法。6、需要用幾種類型的異常就用幾種,尤其是對於應用程序異常。三、異常嵌套和捕獲適當的異常按照Java語言的定義,所謂異常(Exception)指的就是向調用方法(calling method)表示發生非正常情況的習慣方式。下面討論兩種在處理異常時可茲利用的技術:異常嵌套和捕獲適當的異常。異常嵌套你在試圖捕獲異常並打算扔出異常時該採取什麼措施呢?同時,你希望原始的異常信息可用嗎?要回答以上的問題你不妨嘗試一下NestedException類。具體的編程並不難,唯一要做的無非是利用構造器並且重載printStackTrace()以便顯示出正確的數據。此外,你還應當考慮封裝Throwable而非Exception類來創建更具有重用性的組件。之後,你可以創建NestedRuntimeException變數封裝Throwable但無需對其進行聲明。捕獲適當的異常正確地處理異常並不是一項輕松的任務,這是因為異常的處理有時會導致程序出現其他不明行為。不過,以下三條規則可以幫助你避免錯誤處理異常所可能遭遇的風險。規則 #1: 總是捕獲扔出異常的類型而不要理睬異常的超類。 為了遵守通常的代碼習慣,你可以採用Exception類的大寫字母作為變數名,如下所示:catch(FileNotFoundException fnfe)以及catch(sqlException sqle)規則 # 2: 決不讓catch塊留空。在很多情況下雖然確實編寫了try/catch塊但在代碼的catch部分卻什麼都沒有做。或者,如果採用了日誌API(Logging API),那麼請編寫代碼把異常寫到日誌中。規則 # 3: 決不扔出Exception基類的實例。開發人員應當總是扔出自己創建的異常類。扔出異常的API很難處理。在聲明方法扔出java.lang.Exception的情況下,所有的問題都會強加在API用戶的頭上,這樣他們就無法以一種專業的編程方式來處理異常。通過為扔出API聲明Exception類的子類這一舉措,API開發人員就可以減輕用戶的負擔。以上提到的兩種技術在處理異常時還可能用得更好、更適當。嵌套技術令異常扔到另一異常的內部,而捕獲適當的異常令程序調試大大簡化。

6. 為什麼java編譯時異常需要try-catch處理,改掉不好嗎

異常有很多種類,爆紅屬於一種
代碼有一個規范,自己寫的代碼
過兩天去看,有時候就看不明白了
項目上線也是一樣,沒有人敢保證
自己的代碼沒有bug,所以報錯機制
提供了一個查閱的平台,方便知道
哪裡出錯了,如何去修改
代碼寫出來只是第一步,後期維護
工作也是必要的

7. 何為異常為什麼要進行異常處理

異常 表示程序運行過程中可能出現的非正常狀態,運行時異常表示虛擬機的通常操作中可能遇到的異常,是一種常見運行錯誤。如果不對異常進行處理,那麼程序就不能夠正常的運行!也就不能完成你想得到的效果。

8. JAVA異常處理的意義何在為什麼要做異常處理,作用是什麼

代替日漸衰落的error code方法的新法,提供error code所未能具體的優勢。

異常處理分離了接收和處理錯誤代碼。這個功能理清了編程者的思緒,也幫助代碼增強了可讀性,方便了維護者的閱讀和理解。


異常處理(又稱為錯誤處理)功能提供了處理程序運行時出現的任何意外或異常情況的方法。異常處理使用try、catch 和 finally關鍵字來嘗試可能未成功的操作,處理失敗,以及在事後清理資源。


(8)編譯時異常為什麼需要處理擴展閱讀

程序設計的要求之一就是程序的健壯性。希望程序在運行時能夠不出或者少出問題。但是,在程序的實際運行時,總會有一些因素導致程序不能正常運行。

在設計演算法時,往往對演算法的正常邏輯處理流程設計得比較准確,對異常情況的處理反而不容易設計全面,導致程序在出現異常情況時崩潰。如果軟體出現這種情況會給用戶帶來極不友好的體驗。

例如:試設計一個程序,運行後提示用戶輸入兩個整數。兩個整數用空格隔開,用戶輸入後,程序顯示出兩個數字的和。這個程序正常的邏輯處理非常簡單,但普用戶輸入的兩個字元串不是整數,程序應該給出提示,否則程序有可能會崩潰。因此針對異常情況的處理也是非常重要的,當然有時這種處理會比較復雜。

熱點內容
uc瀏覽器怎麼緩存視頻 發布:2024-04-20 16:10:44 瀏覽:80
邏輯錯誤預編譯可以檢查出來嗎 發布:2024-04-20 15:58:28 瀏覽:1000
mc中國版伺服器地址 發布:2024-04-20 15:33:13 瀏覽:411
手機修改wifi密碼網站是什麼 發布:2024-04-20 15:22:05 瀏覽:323
js源碼下載 發布:2024-04-20 15:05:16 瀏覽:20
編譯翻譯的區別 發布:2024-04-20 14:55:53 瀏覽:894
登錄之後qq密碼要在哪裡看 發布:2024-04-20 14:55:03 瀏覽:731
天龍多開腳本 發布:2024-04-20 14:53:05 瀏覽:771
同一段代碼編譯的長度不同 發布:2024-04-20 14:24:14 瀏覽:380
緩存美劇權力的游戲 發布:2024-04-20 14:16:52 瀏覽:988