大家好,今天來為大家解答classcastexception翻譯這個問題的一些問題點,包括Java為什么要拋出異常也一樣很多人還不知道,因此呢,今天就來為大家分析分析,現在讓我們一起來看看吧!如果解決了您的問題,還望您關注下本站哦,謝謝~
java web項目中如何優雅的處理異常
如果Java方法不能按照正常的流程執行,那么可以通過另外一種途徑退出:拋出一個封裝了錯誤信息的對象,這個就是Java的異常;當發生異常時,后面的代碼無法繼續執行,而是由異常處理器繼續執行。
01.異常的分類Throwable是所有異常的超類,下一級可以分為Error和Exception:
1.Error
Error是指Java運行時系統內部的錯誤,或者說它代表了JVM本身的錯誤,通常都是比較嚴重的錯誤,比如內存溢出,虛擬機錯誤等等;
Error通常和硬件或JVM有關,和程序本身無關,所以不能被代碼捕獲和處理。
2.Exception
我們經常說的異常是指Exception,又可以分成運行時異常和檢查異常。
RuntimeException:運行時異常,這類異常在編譯期間不強制代碼捕捉,但是可能在在JVM運行期間拋出異常;出現此類異常,通常是代碼的問題,所以需要修改程序避免這類異常。常見的運行時異常,比如:NullPointerException、ClassCastException等等。
CheckedException:檢查異常,這種異常發生在編譯階段,Java編譯器會強制代碼去捕獲和處理此類異常;比如:ClassNotFoundException、IllegalAccessException等等。
02.異常的處理方法捕獲異常使用try...catch語句,把可能發生異常的代碼放到try{...}中,然后使用catch捕獲對應的異常;
我們也可以在代碼塊中使用Throw向上級代碼拋出異常;
在方法中使用throws關鍵字,向上級代碼拋出異常;
03.Throw和throws的區別Throw在方法內,后面跟著異常對象;而throws是用在方法上,后面跟異常類;
Throw會拋出具體的異常對象,當執行到Throw的時候,方法內的代碼也就執行結束了;throws用來聲明異常,提醒調用方這個方法可能會出現這種異常,請做好處理的準備,但是不一定會真的出現異常。
04.如何優雅地處理異常不要試圖通過異常來控制程序流程,比如開發一個接口,正確的做法是對入參進行非空驗證,當參數為空的時候返回“參數不允許為空”,而不應該捕捉到空指針的時候返回錯誤提示。
僅捕獲有必要的代碼,盡量不要用一個try...catch包住大段甚至整個方法內所有的代碼,因為這樣會影響JVM對代碼進行優化,從而帶來額外的性能開銷。
很多程序員喜歡catch(Exceptione),其實應該盡可能地精確地指出是什么異常。
不要忽略異常,捕捉到異常之后千萬不能什么也不做,要么在catch{...}中輸出異常信息,要么通過Throw或throws拋出異常,讓上層代碼處理。
盡量不要在catch{...}中輸出異常后,又向上層代碼拋出異常,因為這樣會輸出多條異常信息,而且它們還是相同的,這樣可能會產生誤導。
不要在finally{...}中寫return,因為try{...}在執行return之前執行finally{...},如果finally{...}中有return,那么將不再執行try{...}中的return。
我將持續分享Java開發、架構設計、程序員職業發展等方面的見解,希望能得到你的關注。什么是RuntimeException列舉至少4個RuntimeException的子類
RuntimeException是java中所有運行時異常的父類,實際運行時出現的都是它的子類,看看RuntimeException的Javadoc就可以隨便列出幾個:
1,Objectx=newInteger(0);System.out.println((String)x)
;當試圖將對象強制轉換為不是實例的子類時,拋出該異常(ClassCastException)2,inta=5/0;一個整數“除以零”時,拋出ArithmeticException異常。
3,Strings=null;intsize=s.size()
;當應用程序試圖在需要對象的地方使用null時,拋出NullPointerException異常4,"hello".indexOf(-1);指示索引或者為負,或者超出字符串的大小,拋出StringIndexOutOfBoundsException異常5,String[]ss=newString[-1];如果應用程序試圖創建大小為負的數組,則拋出NegativeArraySizeException異常。
Java為什么要拋出異常
首先,我們知道Java有3種拋出異常的形式:throw(執行的時候一定拋出某種異常對象),throws(出現異常的可能性,不一定會發生),系統自動拋異常。
throw用在一個語句拋出異常的時候,throw(aninstanceofexceptionclass)比如一個方法/函數里,try{…}catch(Exceptione){thrownewArithmeticException(“XXX”);}finally{…};
throws則是用在聲明方法可能拋出異常的時候,throw(exceptionclass)比如publicintdivision(intx,inty)throwsArithmeticException{…};
系統自動拋異常則是當程序語句出現邏輯錯誤,主義錯誤或類型轉換錯誤的時候,系統自動拋出異常,比如inta=5;intb=0;c=a/b;這個時候移動會自動拋出ArithmeticException。
什么是異常異常,顧名思義,就是有異于正常狀態,有錯誤發生。而這錯誤會阻止Java當前函數方法的運行。
那么Java里面異常的體系是怎么樣的呢?
1.Java里面所有不正常類都繼承于Throwable類;而Throwable類包括2類:Error類和Exception類。
2.Error類包括虛擬機錯誤(VirtualMachineError)和線程死鎖(ThreadDeath)。
3.Exception類則是我們在說的異常;包括運行時異常(RuntimeException)和檢查異常;這里的異常通常是編碼,環境,用戶操作輸入出現了問題。
4.運行時異常(RuntimeException)包括以下4種異常:空指針異常(NullPointerException),數組下標越界異常(ArrayIndexOutOfBoundsException),類型轉換異常(ClassCastException),算術異常(ArithmeticException)。
空指針異常:
數組下標越界異常:
類型轉換異常:
算術異常:
5.最后剩下的檢查異常則是剩下各種異常的集合;這里發生異常的原因有很多,文件異常(IOException),連接異常(SQLException)等等;和運行時異常不同的是,這里的異常我們必須手動在代碼里添加try…catch…(finally…)語句來捕獲處理。
今天又了解學習到了一些具體的額外的異常:
Throw拋出異常詳細過程和throws聲明方法可能會發生異常不同,throw語句則是直接拋出一個異常。
前面有提到,throw(aninstanceofexceptionclass),這里的一個exception類的實例其實也可以說是一個ExceptionObject(Throwable類或則其子類的對象;也可以是自定義的繼承自Throwable的直接或間接的異常類)。如果,我們用了thrownewString(“異常XXX”);則會在編譯的時候報錯,因為String類并不是Throwable類的子類。
接著讓我們回到怎么用throw語句的階段。
一般我們有兩種方式來用throw:直接在某處會發生異常的地方用throw語句或則用try…catch…finally…語句來捕獲處理異常和關閉釋放資源。
首先是第一種,直接在某處會發生異常的地方用throw語句;這是一種主動的方法,主動拋出異常去處理。
而第二種,用try…catch…finally…語句來捕獲處理異常和關閉釋放資源則是被動的方法。try里面放入可能會發生異常的語句塊,如果在運行期間遇到了異常,則會交給catch來處理異常(catch可以是多個,處理不同的異常),finally則是無論有沒有異常發生,只要加上了就會運行。
首先我們來看第一種方法的函數:
我們的intc=4/2,其實是正確的;但是我們的throw語句主動拋出了異常,那么程序就會到catch里面找有沒有這個異常,有的話進行處理。所以我們要主動拋異常的話,要很確信這個代碼一定會發生異常且后期不太會去變動了(最好放在if條件語句里)。所以我們得到的結果如下:
接著我們來看第二種方法。我們一開始先測正確的,只是把主動拋出異常語句給注釋掉:
因為try里面的語句塊沒有異常,所以只執行了try和finally里面的語句塊。運行的結果如下:
我們接著來測當try里面的語句塊有異常,且沒有主動拋出異常的時候,try會不會捕捉到異常吧:
得到的結果如下,會去處理異常和執行finally里面的語句塊:
最后深入理解一點try里面的異常觸發會逐層向上的這個概念。在我們try語句里主動/被動拋出異常的時候,程序會調向調用者程序(上面的例子里就是我們自己這個函數;但有的時候我們會在try語句里執行別的函數比如B,這個函數B里我們假如觸發了異常,它會調向try語句所在的函數A),尋找和它相匹配的catch語句,執行catch語句里面相應的異常處理程序;但假如沒有找到相匹配的catch語句,那么它會再轉向上一層的調用程序…這樣逐層向上,直到最外層的異常程序終止程序并打印出stacktrace。
參考資料
rollbar.com/guides/java…www.javatpoint.com/throw-keywo…www.geeksforgeeks.org/throw-throw…本文分享自華為云社區《Java-throw異常詳解以及過程-云社區-華為云》,作者:gentle_zhou。
什么是runtimeException
Error和RuntimeException及其子類都是未檢查的異常(uncheckedexceptions),而所有其他的Exception類都是檢查了的異常(checkedexceptions)
.checkedexceptions:通常是從一個可以恢復的程序中拋出來的,并且最好能夠從這種異常中使用程序恢復。比如FileNotFoundException,ParseException等。
uncheckedexceptions:通常是如果一切正常的話本不該發生的異常,但是的確發生了。比如ArrayIndexOutOfBoundException,ClassCastException等。
從語言本身的角度講,程序不該去catch這類異常,雖然能夠從諸如RuntimeException這樣的異常中catch并恢復,但是并不鼓勵終端程序員這么做,因為完全沒要必要。
因為這類錯誤本身就是bug,應該被修復,出現此類錯誤時程序就應該立即停止執行。
因此,面對Errors和uncheckedexceptions應該讓程序自動終止執行,程序員不該做諸如try/catch這樣的事情,而是應該查明原因,修改代碼邏輯。
如何深入理解java異常處理機制
Java的異常處理機制是Java語言的重要組成部分,要想理解Java異常處理機制就先要從Java異常處理的概念以及方式開始。在文章開始之前,我先給大家看一個程序:
如果你能清晰的描述出這個程序的運行結果,那么這篇文章就可以不用讀了,否則就仔細的讀一下。
Java異常的概念是程序在執行過程中遇到不可預見的錯誤,這個概念中有兩點需要關注,一點是“程序在運行過程中”,這說明程序本身的語法是沒有問題的,另一點是“不可預見的錯誤”,這就說明異常的產生具有一定的偶然性。
Java的異常處理方式有兩個大的機制一個是try-catch機制,另一個是throws機制。try-catch機制簡單的說就是捕獲并處理異常,try-catch的用法非常靈活,既可以分層處理異常,也可以嵌套處理異常,看一個例子:
當try體中產生異常的時候,系統就會跳轉到catch體進行異常處理,在這個例子中一個大的try-catch中還嵌套了一個小的try-catch體來單獨處理一部分語句的異常,同時外部的try體還定義了兩個catch體與之匹配,分別處理不同的異常。注意,在排列的時候要注意順序,因為catch在處理異常的時候是就近匹配的,當程序匹配到一個catch體之后就不再繼續往下匹配了,所以一定要把Exception異常放到后面,否則其他的catch體就起不到作用了。
接下來就要看一下throws和throw這兩個關鍵字的作用了,簡單的說throws是聲明異常,而throw是拋出異常對象。看一個例子:
注意throws的位置在方法的聲明處,而throw則在方法體內,throws后面跟的是異常的類型,而throw后面跟的則是異常的對象。注意在catch體內的throw語句雖然也會拋出一個異常,但是此處的異常并不會拋出到方法外部,這是一個需要注意的地方,看一個例子:
這個例子我們可以看到Foo方法并沒有聲明異常,程序依然可以運行,但是程序的第20行語句并不會得到執行,原因是程序在第11行由于throwe而退出了。
通常情況下,當一個方法聲明異常時,所有調用這個方法的方法要么處理這個異常,要么繼續聲明,不能視而不見,簡單的說,就是異常在傳遞的過程中不能無緣無故的消失,這是保證程序健壯性的一個非常重要的機制。
接下來就是自定義異常了,自定義異常有三個特點,分別是自己定義、自己拋出、自己處理,系統并不會拋出用戶的自定義異常,看一個例子:
自定義異常在實際的使用中還是比較常見的。
當然,在使用try-catch的過程中還有一個重要的結構就是finally體,finally體的作用是無論try體是否有異常產生,finally體的內容都會得到執行,當然也有例外,看一個例子:
這個例子中在try體內調用了exit()方法,導致系統直接退出了,從而略過了fianlly體,這是一個需要注意的地方,通常情況下,finally體用于資源的回收處理。
接下來說一下斷言(assert)的使用,在jdk1.4以后出現了斷言,斷言可以在程序中為程序員驗證各種假設,可以說斷言是對異常處理的一種輔助,看一個例子:
斷言的使用在做測試的時候還是比較常見的。
雖然Java的異常處理看起來比較簡單,但是要想把異常處理的機制搞清楚還是需要一個過程的,我使用Java的時間比較久,我在頭條上也寫了關于學習Java的系列文章,想學習Java的朋友可以關注我,相信一定會有所收獲,如果有Java開發方面的問題,也可以咨詢我。
謝謝!
文章到此結束,如果本次分享的classcastexception翻譯和Java為什么要拋出異常的問題解決了您的問題,那么我們由衷的感到高興!