Java 罕見異常(Runtime Exception )具體引見並總結。本站提示廣大學習愛好者:(Java 罕見異常(Runtime Exception )具體引見並總結)文章只能為提供參考,不一定能成為您想要的結果。以下是Java 罕見異常(Runtime Exception )具體引見並總結正文
本文重在Java中異常機制的一些概念。寫本文的目標在於便利我很長時光後若是忘了這些器械可以經由過程這篇文章敏捷回想起來。
1. 異常機制
1.1 異常機制是指當法式湧現毛病後,法式若何處置。詳細來講,異常機制供給了法式加入的平安通道。當湧現毛病後,法式履行的流程產生轉變,法式的掌握權轉移到異常處置器。
1.2 傳統的處置異常的方法是,函數前往一個特別的成果來表現湧現異常(平日這個特別成果是年夜家商定俗稱的),挪用該函數的法式擔任檢討並剖析函數前往的成果。如許做有以下的弊病:例如函數前往-1代表湧現異常,然則假如函數確切要前往-1這個准確的值時就會湧現混雜;可讀性下降,將法式代碼與處置異常的代碼混爹在一路;由挪用函數的法式來剖析毛病,這就請求客戶法式員對庫函數有很深的懂得。
1.3 異常處置的流程
1.3.1 碰到毛病,辦法立刻停止,其實不前往一個值;同時,拋出一個異常對象
1.3.2 挪用該辦法的法式也不會持續履行下去,而是搜刮一個可以處置該異常的異常處置器,並履行個中的代碼
2 異常的分類
2.1 異常的分類
2.1.1 異常的繼續構造:基類為Throwable,Error和Exception繼續Throwable,RuntimeException和IOException等繼續Exception,詳細的RuntimeException繼續RuntimeException。
2.1.2 Error和RuntimeException及其子類成為未檢討異常(unchecked),其它異常成為已檢討異常(checked)。
2.2 每一個類型的異常的特色
2.2.1 Error系統 Error類系統描寫了Java運轉體系中的外部毛病和資本耗盡的情況。運用法式不該該拋出這類類型的對象(普通是由虛擬機拋出)。假如湧現這類毛病,除努力使法式平安加入外,在其他方面是力所不及的。所以,在停止法式設計時,應當更存眷Exception系統。
2.2.2 Exception系統 Exception系統包含RuntimeException系統和其他非RuntimeException的系統
2.2.2.1 RuntimeException RuntimeException系統包含毛病的類型轉換、數組越界拜訪和試圖拜訪空指針等等。處置RuntimeException的准繩是:假如湧現RuntimeException,那末必定是法式員的毛病。例如,可以經由過程檢討數組下標和數組界限來防止數組越界拜訪異常。
2.2.2.2 其他(IOException等等)這類異常普通是內部毛病,例如試圖從文件尾後讀取數據等,這其實不是法式自己的毛病,而是在運用情況中湧現的內部毛病。
2.3 與C++異常分類的分歧
2.3.1 其實,Java中RuntimeException這個類名起的其實不適當,由於任何異常都是運轉時湧現的。(在編譯時湧現的毛病其實不是異常,換句話說,異常就是為懂得決法式運轉時湧現的的毛病)。
2.3.2 C++中logic_error與Java中的RuntimeException是等價的,而runtime_error與Java中非RuntimeException類型的異常是等價的。
3 異常的應用辦法
3.1 聲明辦法拋出異常
3.1.1 語法:throws(略)
3.1.2 為何要聲明辦法拋出異常?辦法能否拋出異常與辦法前往值的類型一樣主要。假定辦法拋出異常確沒有聲明該辦法將拋出異常,那末客戶法式員可以挪用這個辦法並且不消編寫處置異常的代碼。那末,一旦湧現異常,那末這個異常就沒有適合的異常掌握器來處理。
3.1.3 為何拋出的異常必定是已檢討異常? RuntimeException與Error可以在任何代碼中發生,它們不須要由法式員顯示的拋出,一旦湧現毛病,那末響應的異常會被主動拋出。罷了檢討異常是由法式員拋出的,這分為兩種情形:客戶法式員挪用會拋出異常的庫函數(庫函數的異常由庫法式員拋出);客戶法式員本身應用throw語句拋出異常。碰到Error,法式員普通是力所不及的;碰到RuntimeException,那末必定是法式存在邏輯毛病,要對法式停止修正(相當於調試的一種辦法);只要已檢討異常才是法式員所關懷的,法式應當且僅應當拋出或處置已檢討異常。
3.1.4 留意:籠罩父類某辦法的子類辦法不克不及拋出比父類辦法更多的異常,所以,有時設計父類的辦法時會聲明拋出異常,但現實的完成辦法的代碼卻其實不拋出異常,如許做的目標就是為了便利子類辦法籠罩父類辦法時可以拋出異常。
3.2 若何拋出異常
3.2.1 語法:throw(略)
3.2.2 拋出甚麼異常?關於一個異常對象,真正有效的信息時異常的對象類型,而異常對象自己毫有意義。好比一個異常對象的類型是ClassCastException,那末這個類名就是獨一有效的信息。所以,在選擇拋出甚麼異常時,最症結的就是選擇異常的類名可以或許明白解釋異常情形的類。
3.2.3 異常對象平日有兩種結構函數:一種是無參數的結構函數;另外一種是帶一個字符串的結構函數,這個字符串將作為這個異常對象除類型名之外的額定解釋。
3.2.4 創立本身的異常:當Java內置的異常都不克不及明白的解釋異常情形的時刻,須要創立本身的異常。須要留意的是,獨一有效的就是類型名這個信息,所以不要在異常類的設計上消費精神。
3.3 捕捉異常假如一個異常沒有被處置,那末,關於一個非圖形界面的法式而言,該法式會被中斷並輸入異常信息;關於一個圖形界面法式,也會輸入異常的信息,然則法式其實不中斷,而是前往用戶界面處置輪回中。
3.3.1 語法:try、catch和finally(略)掌握器模塊必需緊接在try塊前面。若擲出一個異常,異常掌握機制會搜索參數與異常類型符合的第一個掌握器隨後它會進入誰人catch 從句,並以為異常已獲得掌握。一旦catch 從句停止對掌握器的搜刮也會停滯。
3.3.1.1 捕捉多個異常(留意語法與捕捉的次序)(略)
3.3.1.2 finally的用法與異常處置流程(略)
3.3.2 異常處置做甚麼?關於Java來講,因為有了渣滓搜集,所以異常處置其實不須要收受接管內存。然則仍然有一些資本須要法式員來搜集,好比文件、收集銜接和圖片等資本。
3.3.3 應當聲明辦法拋出異常照樣在辦法中捕捉異常?准繩:捕獲並處置哪些曉得若何處置的異常,而傳遞哪些不曉得若何處置的異常
3.3.4 再次拋出異常
3.3.4.1 為何要再次拋出異常?在本級中,只能處置一部門內容,有些處置須要在更高一級的情況中完成,所以應當再次拋出異常。如許可使每級的異常處置器處置它可以或許處置的異常。
3.3.4.2 異常處置流程對應與統一try塊的catch塊將被疏忽,拋出的異常將進入更高的一級。
4 關於異常的其他成績
4.1 過度應用異常起首,應用異常很便利,所以法式員普通不再情願編寫處置毛病的代碼,而僅僅是簡簡略單的拋出一個異常。如許做是纰謬的,關於完整已知的毛病,應當編寫處置這類毛病的代碼,增長法式的魯棒性。別的,異常機制的效力很差。
4.2 將異常與通俗毛病辨別開關於通俗的完整分歧的毛病,應當編寫處置這類毛病的代碼,增長法式的魯棒性。只要內部的不克不及肯定和預知的運轉時毛病才須要應用異常。
4.3 異常對象中包括的信息普通情形下,異常對象獨一有效的信息就是類型信息。但應用異常帶字符串的結構函數時,這個字符串還可以作為額定的信息。挪用異常對象的getMessage()、toString()或許printStackTrace()辦法可以分離獲得異常對象的額定信息、類名和挪用客棧的信息。而且後一種包括的信息是前一種的超集。
經常使用異常:
UnsupportedOperationException不支撐的操作
IllegalArgumentException不法參數
IndexOutOfBoundsException索引出界
IllegalStateException不法狀況
異常跟通俗的正告等有必定的差別。當運用法式產生異常時,會中止正在履行的法式的正常指令流。也就是說,產生異常前面的代碼將得不到准確的履行。乃至還會觸發數據庫的回退操作。
在Java開辟平台中,異常包含預界說異常與自界說異常。這兩種異常的類型互為彌補。作為一個及格的法式開辟人員,要擅長在運用法式中應用異常。這可以進步運用法式的交互性。同時,也是包管運用法式正常運轉的條件。故異常的處置關於開辟一個優良的運用法式來講異常的主要。為此筆者以為法式開辟人員應當對Java運用法式的罕見異常有一個深刻的懂得。只要在懂得這些罕見異常的情形下,能力夠做好自界說異常的處置。
1、罕見異常的類型與緣由。
關於Java運用法式的罕見異常,筆者以為法式開辟人員要從兩個方面去懂得。一是要曉得有哪些罕見的Java運用法式異常,二是須要曉得哪些緣由能夠會形成這個異常。這不只須要法式治理人員在平常任務中要留意積聚,在需要的情形下還須要去從其它渠道搜集材料。筆者對此就停止一個剖析,願望可以或許對列位法式開辟人員有必定的贊助。
1、 SQLException:操作數據庫異常類。
如今的Java運用法式年夜部門都是依附於數據庫運轉的。當Java運用法式與數據庫停止溝通時假如發生了毛病,就會觸發這個類。同時會將數據庫的毛病信息經由過程這個類顯示給用戶。也就是說,這個操作數據庫異常類是數據庫與用戶之間異常信息傳遞的橋梁。如如今用戶往體系中拔出數據,而在數據庫中劃定某個字段必需獨一。當用戶拔出數據的時刻,假如這個字段的值跟現有的記載反復了,違背了數據庫的獨一性束縛,此時數據庫就會跑出一個異常信息。這個信息普通用戶能夠看不到,由於其產生在數據庫層面的。此時這個操作數據庫異常類就會捕獲到數據庫的這個異常信息,並將這個異常信息傳遞到前台。如斯的話,前台用戶便可以依據這個異常信息來剖析產生毛病的緣由。這就是這個操作數據庫異常類的重要用處。在Java運用法式中,一切數據庫操作產生異常時,都邑觸發這一個類。一切此時Java運用法式自己的提醒信息常常過於籠統,只是說與數據庫交互湧現毛病,沒有多年夜的參考價值。此時反而是數據庫的提醒信息加倍有應用價值。
2、 ClassCastException:數據類型轉換異常。
在Java運用法式中,有時刻須要對數據類型停止轉換。這個轉換包含顯示的轉換與隱式的轉換。不外不管怎樣轉換,都必需要相符一個條件的前提,即數據類型的兼容性。假如在數據轉換的進程中,違背了這個准繩,那末就會觸發數據類型轉換異常。如如今在運用法式中,開辟人員須要將一個字符型的日期數據轉換為數據庫所可以或許接收的日期型數據,此時只須要在前台運用法式中停止掌握,普通不會有成績。然則,假如前台運用法式缺少相干的掌握,如用戶在輸出日期的時刻只輸出月、日信息,而沒豐年份的信息。此時運用法式在停止數據類型轉換的時刻,就會湧現異常。依據筆者的經歷,數據類型轉換異常在運用法式開辟中使一個湧現的比擬多的異常,也是一個比擬初級的異常。由於年夜部門情形下,都可以在運用法式窗口中對數據類型停止一些強迫的掌握。即在數據類型停止轉換之前,就包管數據類型的兼容性。如斯的話,就不輕易形成數據類型的轉換異常。如在只許可數值類型的字段中,可以設置不許可用戶輸出數值之外的字符。固然說有了異常處置機制,可以包管運用法式不會被毛病的運轉。然則在現實開辟中,照樣要盡量多的預感毛病產生的緣由,盡可能防止異常的產生。
3、 NumberFormatException:字符串轉換為數字類型時拋出的異常。
在數據類型轉換進程中,假如是字符型轉換為數字型進程中湧現的成績,關於這個異常在Java法式中采取了一個自力的異常,即NumberFormatException.如如今講字符型的數據“123456”轉換為數值型數據時,是許可的。然則假如字符型數據中包括了非數字型的字符,如123#56,此時轉換為數值型時就會湧現異常。體系就會捕獲到這個異常,並停止處置。
Java運用法式中罕見的異常類還有許多。如未找到響應類異常、不許可拜訪某些類異常、文件曾經停止異常、文件未找到異常、字段未找到異常等等。普通體系開辟人員都可以依據這個異常名來斷定以後異常的類型。固然不錯,然則好忘性不如爛筆頭。法式開辟人員在需要的時刻(特殊是存在自界說異常的時刻),最初手頭有一份異常明細表。如斯的話,不管是運用法式在調試進程中發明成績,照樣運轉進程中接到用戶的贊揚,都可和時的依據異常名字來找到異常產生的緣由。從而可以在最短時光內處理異常,恢復運用法式的正常運轉。這個辦法筆者用了許多年,異常的有用。
2、異常治理的適用建議。
關於操作數據庫異常來講,Java運用法式只供給了一個異常類。故光憑Java運用法式的毛病信息,常常不克不及夠贊助運用法式人員消除毛病的緣由。只可以或許指名是運用法式毛病照樣數據庫毛病招致的這個異常。為了更進一步指明成績的緣由,在數據庫層面界說異常的時刻,最好可以或許解釋詳細的緣由。如前台運用法式能夠會挪用數據庫的函數或許進程。此時在數據庫的函數或許進程中做好可以或許解釋某個異常的詳細緣由。如依據某個基本表生成另外一張表的時刻,某個字段不克不及夠為空等等。將這些異常信息解釋清晰後,假如真的碰到相似的異常時,操作數據庫異常類就會將數據庫的異常信息反會給前台用戶。從而有益於用戶尋覓成績的緣由,並在最短時光內糾正。固然,這須要Java法式員與數據庫設計人員停止調和。
其次須要留意的是,異常其實不是常態。也就是說,年夜部門異常可以經由過程條件的公道預感與預防,來清除。如設計到四則運算,可以在前台運用法式窗口中限制在除數字段內輸出0值等手腕來清除運用法式運轉中能夠發生的異常。不外這常常請求運用法式開辟人員有比擬豐碩的任務經歷和由比擬周密的思想邏輯。固然這有必定的難度,然則筆者以為法式開辟人員照樣應當往這方面盡力,而不要總是讓用戶作為你的實驗品,讓用戶來發明運用法式中的設計Bug.筆者以為,只要一些其實是法式人員沒法掌握的身分才許可拋出異常。假如運用法式開辟人員可以或許認識到這類毛病、然則依然沒有惹起看重或許采用有用的辦法避免湧現這類異常,那末筆者是不許可的。
ArithmeticException(除數為0的異常), BufferOverflowException(緩沖區上溢異常), BufferUnderflowException(緩沖區下溢異常), IndexOutOfBoundsException(出界異常), NullPointerException(空指針異常), EmptyStackException(空棧異常), IllegalArgumentException(不正當的參數異常), NegativeArraySizeException, NoSuchElementException, SecurityException, SystemException, UndeclaredThrowableException
1. java.lang.NullPointerException
異常的說明是"法式趕上了空指針",簡略地說就是挪用了未經初始化的對象或許是不存在的對象,即把數組的初始化和數組元素的初始化混雜起來了。數組的初始化是對數組分派須要的空間,而初始化後的數組,個中的元素並沒有實例化,仍然是空的,所以還須要對每一個元素都停止初始化(假如要挪用的話)
2. java.lang.ClassNotFoundException
異常的說明是"指定的類不存在"。
3. java.lang.ArithmeticException
這個異常的說明是"數學運算異常",好比法式中湧現了除以零如許的運算就會出如許的異常。
4. java.lang.ArrayIndexOutOfBoundsException
異常的說明是"數組下標越界",如今法式中年夜多都有對數組的操作,是以在挪用數組的時刻必定要賣力檢討,看本身挪用的下標是否是超越了數組的規模,普通來講,顯示(即直接用常數當下標)挪用不太輕易出如許的錯,但隱式(即用變量表現下標)挪用就常常失足了,還有一種情形,是法式中界說的數組的長度是經由過程某些特定辦法決議的,不是事前聲明的,這個時刻,最好先檢查一下數組的length,以避免湧現這個異常。
5. java.lang.IllegalArgumentException
這個異常的說明是"辦法的參數毛病",好比g.setColor(int red,int green,int blue)這個辦法中的三個值,假如有跨越255的也會湧現這個異常,是以一旦發明這個異常,我們要做的,就是趕忙去檢討一下辦法挪用中的參數傳遞是否是湧現了毛病。
6. java.lang.IllegalAccessException
這個異常的說明是"沒有拜訪權限",當運用法式要挪用一個類,但以後的辦法即沒有對該類的拜訪權限便會湧現這個異常。對法式頂用了Package的情形下要留意這個異常
的, 異常, Java
感激浏覽,願望能贊助到年夜家,感謝年夜家對本站的支撐!