1. 程式人生 > >JAVA專案中常用的異常知識點總結

JAVA專案中常用的異常知識點總結

JAVA專案中常用的異常知識點總結 1. java.lang.nullpointerexception
這個異常大家肯定都經常遇到,異常的解釋是"程式遇上了空指標",簡單地說就是呼叫了未經初始化的物件或者是不存在的物件,這個錯誤經常出現在建立圖片,呼叫陣列這些操作中,比如圖片未經初始化,或者圖片建立時的路徑錯誤等等。對陣列操作中出現空指標,很多情況下是一些剛開始學習程式設計的朋友常犯的錯誤,即把陣列的初始化和陣列元素的初始化混淆起來了。陣列的初始化是對陣列分配需要的空間,而初始化後的陣列,其中的元素並沒有例項化,依然是空的,所以還需要對每個元素都進行初始化(如果要呼叫的話) 3. java.lang.arithmeticexception
這個異常的解釋是"數學運算異常",比如程式中出現了除以零這樣的運算就會出這樣的異常,對這種異常,大家就要好好檢查一下自己程式中涉及到數學運算的地方,公式是不是有不妥了。 4. java.lang.arrayindexoutofboundsexception
這個異常相信很多朋友也經常遇到過,異常的解釋是"陣列下標越界",現在程式中大多都有對陣列的操作,因此在呼叫陣列的時候一定要認真檢查,看自己呼叫的下標是不是超出了陣列的範圍,一般來說,顯示(即直接用常數當下標)呼叫不太容易出這樣的錯,但隱式(即用變量表示下標)呼叫就經常出錯了,還有一種情況,是程式中定義的陣列的長度是通過某些特定方法決定的,不是事先宣告的,這個時候,最好先檢視一下陣列的length,以免出現這個異常。 5. java.lang.illegalargumentexception
這個異常的解釋是"方法的引數錯誤",很多j2me的類庫中的方法在一些情況下都會引發這樣的錯誤,比如音量調節方法中的音量引數如果寫成負數就會出現這個異常,再比如g.setcolor(int red,int green,int blue)這個方法中的三個值,如果有超過255的也會出現這個異常,因此一旦發現這個異常,我們要做的,就是趕緊去檢查一下方法呼叫中的引數傳遞是不是出現了錯誤。 6. java.lang.illegalaccessexception
這個異常的解釋是"沒有訪問許可權",當應用程式要呼叫一個類,但當前的方法即沒有對該類的訪問許可權便會出現這個異常。對程式中用了package的情況下要注意這個異常。     NullPointerException - 空指標引用異常
ClassCastException - 型別強制轉換異常。
IllegalArgumentException - 傳遞非法引數異常。
ArithmeticException - 算術運算異常
ArrayStoreException - 向陣列中存放與宣告型別不相容物件異常
IndexOutOfBoundsException - 下標越界異常
NegativeArraySizeException - 建立一個大小為負數的陣列錯誤異常
NumberFormatException - 數字格式異常
SecurityException - 安全異常
UnsupportedOperationException - 不支援的操作異常
 
算術異常類:ArithmeticExecption
空指標異常類:NullPointerException
型別強制轉換異常:ClassCastException
陣列負下標異常:NegativeArrayException
陣列下標越界異常:ArrayIndexOutOfBoundsException
違背安全原則異常:SecturityException
檔案已結束異常:EOFException
檔案未找到異常:FileNotFoundException
字串轉換為數字異常:NumberFormatException
操作資料庫異常:SQLException
輸入輸出異常:IOException
方法未找到異常:NoSuchMethodException
java.lang.AbstractMethodError 抽象方法錯誤。當應用試圖呼叫抽象方法時丟擲。
java.lang.AssertionError
斷言錯。用來指示一個斷言失敗的情況。
java.lang.ClassCircularityError
類迴圈依賴錯誤。在初始化一個類時,若檢測到類之間迴圈依賴則丟擲該異常。
java.lang.ClassFormatError
類格式錯誤。當Java虛擬機器試圖從一個檔案中讀取Java類,而檢測到該檔案的內容不符合類的有效格式時丟擲。
java.lang.Error
錯誤。是所有錯誤的基類,用於標識嚴重的程式執行問題。這些問題通常描述一些不應被應用程式捕獲的反常情況。
java.lang.ExceptionInInitializerError
初始化程式錯誤。當執行一個類的靜態初始化程式的過程中,發生了異常時丟擲。靜態初始化程式是指直接包含於類中的static語句段。
java.lang.IllegalAccessError
違法訪問錯誤。當一個應用試圖訪問、修改某個類的域(Field)或者呼叫其方法,但是又違反域或方法的可見性宣告,則丟擲該異常。
java.lang.IncompatibleClassChangeError
不相容的類變化錯誤。當正在執行的方法所依賴的類定義發生了不相容的改變時,丟擲該異常。一般在修改了應用中的某些類的宣告定義而沒有對整個應用重新編譯而直接執行的情況下,容易引發該錯誤。
java.lang.InstantiationError
例項化錯誤。當一個應用試圖通過Java的new操作符構造一個抽象類或者介面時丟擲該異常.
java.lang.InternalError
內部錯誤。用於指示Java虛擬機發生了內部錯誤。
java.lang.LinkageError
連結錯誤。該錯誤及其所有子類指示某個類依賴於另外一些類,在該類編譯之後,被依賴的類改變了其類定義而沒有重新編譯所有的類,進而引發錯誤的情況。
java.lang.NoClassDefFoundError
未找到類定義錯誤。當Java虛擬機器或者類裝載器試圖例項化某個類,而找不到該類的定義時丟擲該錯誤。
java.lang.NoSuchFieldError
域不存在錯誤。當應用試圖訪問或者修改某類的某個域,而該類的定義中沒有該域的定義時丟擲該錯誤。
java.lang.NoSuchMethodError
方法不存在錯誤。當應用試圖呼叫某類的某個方法,而該類的定義中沒有該方法的定義時丟擲該錯誤。
java.lang.OutOfMemoryError
記憶體不足錯誤。當可用記憶體不足以讓Java虛擬機器分配給一個物件時丟擲該錯誤。
java.lang.StackOverflowError
堆疊溢位錯誤。當一個應用遞迴呼叫的層次太深而導致堆疊溢位時丟擲該錯誤。
java.lang.ThreadDeath
執行緒結束。當呼叫Thread類的stop方法時丟擲該錯誤,用於指示執行緒結束。
java.lang.UnknownError
未知錯誤。用於指示Java虛擬機發生了未知嚴重錯誤的情況。
java.lang.UnsatisfiedLinkError
未滿足的連結錯誤。當Java虛擬機器未找到某個類的宣告為native方法的本機語言定義時丟擲。
java.lang.UnsupportedClassVersionError
不支援的類版本錯誤。當Java虛擬機器試圖從讀取某個類檔案,但是發現該檔案的主、次版本號不被當前Java虛擬機器支援的時候,丟擲該錯誤。
java.lang.VerifyError
驗證錯誤。當驗證器檢測到某個類檔案中存在內部不相容或者安全問題時丟擲該錯誤。
java.lang.VirtualMachineError
虛擬機器錯誤。用於指示虛擬機器被破壞或者繼續執行操作所需的資源不足的情況。
java.lang.ArithmeticException
算術條件異常。譬如:整數除零等。
java.lang.ArrayIndexOutOfBoundsException
陣列索引越界異常。當對陣列的索引值為負數或大於等於陣列大小時丟擲。
java.lang.ArrayStoreException
陣列儲存異常。當向陣列中存放非陣列宣告型別物件時丟擲。
java.lang.ClassCastException
類造型異常。假設有類A和B(A不是B的父類或子類),O是A的例項,那麼當強制將O構造為類B的例項時丟擲該異常。該異常經常被稱為強制型別轉換異常。
java.lang.ClassNotFoundException
找不到類異常。當應用試圖根據字串形式的類名構造類,而在遍歷CLASSPAH之後找不到對應名稱的class檔案時,丟擲該異常。
java.lang.CloneNotSupportedException
不支援克隆異常。當沒有實現Cloneable介面或者不支援克隆方法時,呼叫其clone()方法則丟擲該異常。
java.lang.EnumConstantNotPresentException
列舉常量不存在異常。當應用試圖通過名稱和列舉型別訪問一個列舉物件,但該列舉物件並不包含常量時,丟擲該異常。
java.lang.Exception
根異常。用以描述應用程式希望捕獲的情況。
java.lang.IllegalAccessException
違法的訪問異常。當應用試圖通過反射方式建立某個類的例項、訪問該類屬性、呼叫該類方法,而當時又無法訪問類的、屬性的、方法的或構造方法的定義時丟擲該異常。
java.lang.IllegalMonitorStateException
違法的監控狀態異常。當某個執行緒試圖等待一個自己並不擁有的物件(O)的監控器或者通知其他執行緒等待該物件(O)的監控器時,丟擲該異常。
java.lang.IllegalStateException
違法的狀態異常。當在Java環境和應用尚未處於某個方法的合法呼叫狀態,而呼叫了該方法時,丟擲該異常。
java.lang.IllegalThreadStateException
違法的執行緒狀態異常。當縣城尚未處於某個方法的合法呼叫狀態,而呼叫了該方法時,丟擲異常。
java.lang.IndexOutOfBoundsException
索引越界異常。當訪問某個序列的索引值小於0或大於等於序列大小時,丟擲該異常。
java.lang.InstantiationException
例項化異常。當試圖通過newInstance()方法建立某個類的例項,而該類是一個抽象類或介面時,丟擲該異常。
java.lang.InterruptedException
被中止異常。當某個執行緒處於長時間的等待、休眠或其他暫停狀態,而此時其他的執行緒通過Thread的interrupt方法終止該執行緒時丟擲該異常。
java.lang.NegativeArraySizeException
陣列大小為負值異常。當使用負數大小值建立陣列時丟擲該異常。
java.lang.NoSuchFieldException
屬性不存在異常。當訪問某個類的不存在的屬性時丟擲該異常。
java.lang.NoSuchMethodException
方法不存在異常。當訪問某個類的不存在的方法時丟擲該異常。
java.lang.NullPointerException
空指標異常。當應用試圖在要求使用物件的地方使用了null時,丟擲該異常。譬如:呼叫null物件的例項方法、訪問null物件的屬性、計算null物件的長度、使用throw語句丟擲null等等。
java.lang.NumberFormatException
數字格式異常。當試圖將一個String轉換為指定的數字型別,而該字串確不滿足數字型別要求的格式時,丟擲該異常。
java.lang.RuntimeException
執行時異常。是所有Java虛擬機器正常操作期間可以被丟擲的異常的父類。
java.lang.SecurityException
安全異常。由安全管理器丟擲,用於指示違反安全情況的異常。
java.lang.StringIndexOutOfBoundsException
字串索引越界異常。當使用索引值訪問某個字串中的字元,而該索引值小於0或大於等於序列大小時,丟擲該異常。
java.lang.TypeNotPresentException 型別不存在異常。當應用試圖以某個型別名稱的字串表達方式訪問該型別,但是根據給定的名稱又找不到該型別是丟擲該異常。該異常與ClassNotFoundException的區別在於該異常是unchecked(不被檢查)異常,而ClassNotFoundException是checked(被檢查)異常。
java.lang.TypeNotPresentException :型別不存在異常。
原文:https://blog.csdn.net/csdngjj/article/details/78109830
參考:Java EE專案中的異常處理總結(一篇不得不看的文章)_java_指令碼之家
https://www.jb51.net/article/96553.htm(備註:超級全面)

在專案中的一些對異常處理的相關約定或準則

1、不要捕獲 Java 類庫中定義的繼承自 RuntimeException 的執行時異常類,如:IndexOutOfBoundsException / NullPointerException,這類異常由程式設計師預檢查違法來規避,保證程式健壯性。

正例: if(obj != null) {...} 
反例: try { obj.method() } catch(NullPointerException e){...} 

2、異常不要用來做流程控制,條件控制,因為異常的處理效率比條件分支低。這個坑大家要注意了。

3、對大段程式碼進行 try-catch,這是不負責任的表現。 catch 時請分清穩定程式碼和非穩定程式碼,穩定程式碼指的是無論如何不會出錯的程式碼。對於非穩定程式碼的 catch 儘可能進行區分異常型別,再做對應的異常處理。

4、捕獲異常是為了處理它,不要捕獲了卻什麼都不處理而拋棄之,如果不想處理它,請將該異常拋給它的呼叫者。最外層的業務使用者,必須處理異常,將其轉化為使用者可以理解的內容。

6、finally 塊必須對資源物件、流物件進行關閉,有異常也要做 try-catch。說明: 如果 JDK7,可以使用 try-with-resources 方式。
7、不能在 finally 塊中使用 return, finally 塊中的 return 返回後方法結束執行,不會再執行 try 塊中的 return 語句。

8、捕獲異常與拋異常,必須是完全匹配,或者捕獲異常是拋異常的父類。說明: 如果預期對方拋的是繡球,實際接到的是鉛球,就會產生意外情況。

9、方法的返回值可以為 null,不強制返回空集合,或者空物件等,必須添加註釋充分說明什麼情況下會返回 null 值。呼叫方需要進行 null 判斷防止 NPE 問題。
說明: 本規約明確防止 NPE 是呼叫者的責任。即使被呼叫方法返回空集合或者空物件,對呼叫者來說,也並非高枕無憂,必須考慮到遠端呼叫失敗,執行時異常等場景返回 null 的情況。

10、定義時區分 unchecked / checked 異常,避免直接使用 RuntimeException 丟擲,更不允許丟擲 Exception 或者 Throwable,應使用有業務含義的自定義異常。推薦業界已定義過的自定義異常,如: DAOException / ServiceException 等。
11、對於執行時異常,我們不要用try...catch來捕獲處理,而是在程式開發除錯階段,儘量去避免這種異常,一旦發現該異常,正確的做法就會改程序序設計的程式碼和實現方式,修改程式中的錯誤,從而避免這種異常。捕獲並處理執行時異常是好的解決辦法,因為可以通過改進程式碼實現來避免該種異常的發生。對於受檢查異常,沒說的,老老實實去按照異常處理的方法去處理,要麼用try...catch捕獲並解決,要麼用throws丟擲!對於Error(執行時錯誤),不需要在程式中做任何處理,出現問題後,應該在程式在外的地方找問題,然後解決。

執行時異常和檢查型異常的區別

Java提供了兩類主要的異常:runtime exception和checked exception。
1)checked(檢查型) 異常也就是我們經常遇到的IO異常,以及SQL異常都是這種異常。對於這種異常,JAVA編譯器強制要求我們必需對出現的這些異常進行catch。所以,面對這種異常不管我們是否願意,只能自己去寫一大堆catch塊去處理可能的異常。

2)但是另外一種異常:runtime exception,也稱執行時異常,我們可以不處理。當出現這樣的異常時,總是由虛擬機器接管。比如:我們從來沒有人去處理過NullPointerException異常,它就是執行時異常,並且這種異常還是最常見的異常之一。
出現執行時異常後,系統會把異常一直往上層拋,一直遇到處理程式碼。如果沒有處理塊,到最上層,如果是多執行緒就由Thread.run()丟擲,如果是單執行緒就被main()丟擲。丟擲之後,如果是執行緒,這個執行緒也就退出了。如果是主程式丟擲的異常,那麼這整個程式也就退出了。
執行時異常是Exception的子類,也有一般異常的特點,是可以被Catch塊處理的。只不過往往我們不對他處理罷了。也就是說,你如果不對執行時異常進行處理,那麼出現執行時異常之後,要麼是執行緒中止,要麼是主程式終止。

如果不想終止,則必須撲捉所有的執行時異常,決不讓這個處理執行緒退出。佇列裡面出現異常資料了,正常的處理應該是把異常資料捨棄,然後記錄日誌。不應該由於異常資料而影響下面對正常資料的處理。在這個場景這樣處理可能是一個比較好的應用,但並不代表在所有的場景你都應該如此。
如果在其它場景,遇到了一些錯誤,如果退出程式比較好,這時你就可以不太理會執行時異常,或者是通過對異常的處理顯式的控制程式退出。