㈠ java異常分類
一、概念
如果某個方法不能按照正常的途徑完成任務,就可以通過另一種路徑退出方法。在這種情況下
會拋出一個封裝了錯誤信息的對象。此時,這個方法會立刻退出同時不返回任何值。另外,調用
這個方法的其他代碼也無法繼續執行,異常處理機制會將代碼執行交給異常處理器。
二、異常分類
Throwable 是 Java 語言中所有錯誤或異常的超類,在 Java 中只有 Throwable 類型的實例才可以被拋出(throw)或者捕獲(catch),它是異常處理機制的基本組成類型。
實例分為 Error 和 Exception 兩種。
2.1、Error
Error 類是指 java 運行時系統的內部錯誤和資源耗盡錯誤。應用程序不會拋出該類對象。如果
出現了這樣的錯誤,除了告知用戶,剩下的就是盡力使程序安全的終止。
2.2、Exception
Exception 又有兩個分支 , 一個是運行時異常 RuntimeException , 一 個是檢查異常 CheckedException。
RuntimeException 如 :NullPointerException 、 ClassCastException ;
CheckedException 如: I/O 錯誤導致的 IOException、SQLException。
RuntimeException 是那些可能在 Java 虛擬機正常運行期間拋出的異常的超類。 如果出現 RuntimeException,那麼一
定是程序員代碼書寫導致的錯誤.
CheckedException:一般是外部錯誤,這種異常都發生在編譯階段,Java 編譯器會強
製程序去捕獲此類異常,即會出現要求你把這段可能出現異常的程序進行 try catch,該類異常一
般包括幾個方面:
試圖在文件尾部讀取數據
試圖打開一個錯誤格式的 URL
試圖根據給定的字元串查找 class 對象,而這個字元串表示的類並不存在
三、異常的處理方式
3.1、不處理
遇到異常問題不進行具體處理,而是繼續拋給調用者 (throw,throws)
拋出異常有三種形式,一是 throw,再就是 throws,還有一種系統自動拋異常。
public static void main(String[] args) {
String s = "abc";
if(s.equals("abc")) {
/** 手動拋出一個數字格式化異常 **/
throw new NumberFormatException();
} else {
System.out.println(s);
}
}
int div(int a,int b) throws Exception{
return a/b;
}
3.2、處理
try catch 捕獲異常針對性處理方式
四、Throw 和 throws 的區別
throws 用在函數上,後面跟的是異常類,可以跟多個;
語法:(修飾符)(方法名)([參數列表])[throws(異常類)]{……}
public void doA(int a) throws Exception1,Exception3{……}
throw 用在函數內,後面跟的是異常對象。
throws E1,E2,E3隻是告訴程序這個方法可能會拋出這些異常,方法的調用者可能要處理這些異常,而這些異常E1,E2,E3可能是該函數體產生的。
throw則是明確了這個地方要拋出這個異常。
結合來看:
void doA(int a) throws IOException,{
try{
......
}catch(Exception1 e){
throw e;
}catch(Exception2 e){
System.out.println("出錯了!");
}
if(a!=b)
throw new Exception3("自定義異常");
}
throws 用來聲明異常,讓調用者知道該功能可能會出現的問題(比如上方的 IO 異常),可以給出預先的處理方式;
throw 拋出具體的問題對象,執行到 throw,功能就已經結束了,跳轉到調用者,並將具體的問題對象拋給調用者。
也就是說 throw 語句獨立存在時,下面不要定義其他語句,因為執行不到。
概括:
throws 表示出現異常的一種可能性,並不一定會發生這些異常;
throw 則是拋出了異常,執行 throw 則一定拋出了某種異常對象。
五、總結
了解 Exception、Error 兩種異常的區別,面試可能會問。
區分 throws、throw使用維度。
㈡ 在java中常出現的異常和解決方法
1. java.lang.nullpointerexceptionx0dx0a 這個異常大家肯定都經常遇到,異常的解釋是"程序遇上了空指針",簡單地說就是調用了未經初始化的對象或者是不存在的對象,這個錯誤經常出現在創建圖片,調用數組這些操作中,比如圖片未經初始化,或者圖片創建時的路徑錯誤等等。對數組操作中出現空指針,很多情況下是一些剛開始學習編程的朋友常犯的錯誤,即把數組的初始化和數組元素的初始化混淆起來了。數組的初始化是對數組分配需要的空間,而初始化後的數組,其中的元素並沒有實例化,依然是空的,所以還需要對每個元素都進行初始化(如果要調用的話)x0dx0ax0dx0a 2. java.lang.classnotfoundexceptionx0dx0a 這個異常是很多原本在jb等開發環境中開發的程序員,把jb下的程序包放在wtk下編譯經常出現的問題,異常的解釋是"指定的類不存在",這里主要考慮一下類的名稱和路徑是否正確即可,如果是在jb下做的程序包,一般都是默認加上package的,所以轉到wtk下後要注意把package的路徑加上。x0dx0ax0dx0a 3. java.lang.arithmeticexceptionx0dx0a 這個異常的解釋是"數學運算異常",比如程序中出現了除以零這樣的運算就會出這樣的異常,對這種異常,大家就要好好檢查一下自己程序中涉及到數學運算的地方,公式是不是有不妥了。x0dx0ax0dx0a 4. java.lang.x0dx0a 這個異常相信很多朋友也經常遇到過,異常的解釋是"數組下標越界",現在程序中大多都有對數組的操作,因此在調用數組的時候一定要認真檢查,看自己調用的下標是不是超出了數組的范圍,一般來說,顯示(即直接用常數當下標)調用不太容易出這樣的錯,但隱式(即用變數表示下標)調用就經常出錯了,還有一種情況,是程序中定義的數組的長度是通過某些特定方法決定的,不是事先聲明的,這個時候,最好先查看一下數組的length,以免出現這個異常。x0dx0ax0dx0a 5. java.lang. 這個異常的解釋是"方法的參數錯誤",很多j2me的類庫中的方法在一些情況下都會引發這樣的錯誤,比如音量調節方法中的音量參數如果寫成負數就會出現這個異常,再比如g.setcolor(int red,int green,int blue)這個方法中的三個值,如果有超過255的也會出現這個異常,因此一旦發現這個異常,我們要做的,就是趕緊去檢查一下方法調用中的參數傳遞是不是出現了錯誤。x0dx0ax0dx0a 6. java.lang.illegalaccessexceptionx0dx0a 這個異常的解釋是"沒有訪問許可權",當應用程序要調用一個類,但當前的方法即沒有對該類的訪問許可權便會出現這個異常。對程序中用了package的情況下要注意這個異常。x0dx0ax0dx0a 其他還有很多異常,我就不一一列舉了,我要說明的是,一個合格的程序員,需要對程序中常見的問題有相當的了解和相應的解決辦法,否則僅僅停留在寫程序而不會改程序的話,會極大影響到自己的開發的。關於異常的全部說明,在api里都可以查閱。x0dx0ax0dx0a算術異常類:空指針異常類:類型強制轉換異常:數組負下標異常:數組下標越界異常:x0dx0ax0dx0a違背安全原則異常:文件已結束異常:EOFExceptionx0dx0ax0dx0a文件未找到異常:字元串轉換為數字異常:操作資料庫異常:SQLExceptionx0dx0ax0dx0a輸入輸出異常:IOExceptionx0dx0ax0dx0a方法未找到異常:.lang.抽象方法錯誤。當應用試圖調用抽象方法時拋出。x0dx0ax0dx0ajava.lang.AssertionErrorx0dx0ax0dx0a斷言錯。用來指示一個斷言失敗的情況。x0dx0ax0dx0ajava.lang.類循環依賴錯誤。在初始化一個類時,若檢測到類之間循環依賴則拋出該異常。x0dx0ax0dx0ajava.lang.ClassFormatErrorx0dx0ax0dx0a類格式錯誤。當Java虛擬機試圖從一個文件中讀取Java類,而檢測到該文件的內容不符合類的有效格式時拋出。x0dx0ax0dx0ajava.lang.Errorx0dx0ax0dx0a錯誤。是所有錯誤的基類,用於標識嚴重的程序運行問題。這些問題通常描述一些不應被應用程序捕獲的反常情況。x0dx0ax0dx0ajava.lang.初始化程序錯誤。當執行一個類的靜態初始化程序的過程中,發生了異常時拋出。靜態初始化程序是指直接包含於類中的static語句段。x0dx0ax0dx0ajava.lang.違法訪問錯誤。當一個應用試圖訪問、修改某個類的域(Field)或者調用其方法,但是又違反域或方法的可見性聲明,則拋出該異常。x0dx0ax0dx0ajava.lang.不兼容的類變化錯誤。當正在執行的方法所依賴的類定義發生了不兼容的改變時,拋出該異常。一般在修改了應用中的某些類的聲明定義而沒有對整個應用重新編譯而直接運行的情況下,容易引發該錯誤。x0dx0ax0dx0ajava.lang.實例化錯誤。當一個應用試圖通過Java的new操作符構造一個抽象類或者介面時拋出該異常.x0dx0ax0dx0ajava.lang.InternalErrorx0dx0ax0dx0a內部錯誤。用於指示Java虛擬機發生了內部錯誤。x0dx0ax0dx0ajava.lang.LinkageErrorx0dx0ax0dx0a鏈接錯誤。該錯誤及其所有子類指示某個類依賴於另外一些類,在該類編譯之後,被依賴的類改變了其類定義而沒有重新編譯所有的類,進而引發錯誤的情況。x0dx0ax0dx0ajava.lang.未找到類定義錯誤。當Java虛擬機或者類裝載器試圖實例化某個類,而找不到該類的定義時拋出該錯誤。x0dx0ax0dx0ajava.lang.NoSuchFieldErrorx0dx0ax0dx0a域不存在錯誤。當應用試圖訪問或者修改某類的某個域,而該類的定義中沒有該域的定義時拋出該錯誤。x0dx0ax0dx0ajava.lang.NoSuchMethodErrorx0dx0ax0dx0a方法不存在錯誤。當應用試圖調用某類的某個方法,而該類的定義中沒有該方法的定義時拋出該錯誤。x0dx0ax0dx0ajava.lang.OutOfMemoryErrorx0dx0ax0dx0a內存不足錯誤。當可用內存不足以讓Java虛擬機分配給一個對象時拋出該錯誤。x0dx0ax0dx0ajava.lang.堆棧溢出錯誤。當一個應用遞歸調用的層次太深而導致堆棧溢出時拋出該錯誤。x0dx0ax0dx0ajava.lang.ThreadDeathx0dx0ax0dx0a線程結束。當調用Thread類的stop方法時拋出該錯誤,用於指示線程結束。x0dx0ax0dx0ajava.lang.UnknownErrorx0dx0ax0dx0a未知錯誤。用於指示Java虛擬機發生了未知嚴重錯誤的情況。x0dx0ax0dx0ajava.lang.未滿足的鏈接錯誤。當Java虛擬機未找到某個類的聲明為native方法的本機語言定義時拋出。x0dx0ax0dx0ajava.lang.不支持的類版本錯誤。當Java虛擬機試圖從讀取某個類文件,但是發現該文件的主、次版本號不被當前Java虛擬機支持的時候,拋出該錯誤。x0dx0ax0dx0ajava.lang.VerifyErrorx0dx0ax0dx0a驗證錯誤。當驗證器檢測到某個類文件中存在內部不兼容或者安全問題時拋出該錯誤。x0dx0ax0dx0ajava.lang.虛擬機錯誤。用於指示虛擬機被破壞或者繼續執行操作所需的資源不足的情況。x0dx0ax0dx0ajava.lang.算術條件異常。譬如:整數除零等。x0dx0ax0dx0ajava.lang.x0dx0ax0dx0a數組索引越界異常。當對數組的索引值為負數或大於等於數組大小時拋出。x0dx0ax0dx0ajava.lang.數組存儲異常。當向數組中存放非數組聲明類型對象時拋出。x0dx0ax0dx0ajava.lang.類造型異常。假設有類A和B(A不是B的父類或子類),O是A的實例,那麼當強制將O構造為類B的實例時拋出該異常。該異常經常被稱為強制類型轉換異常。x0dx0ax0dx0ajava.lang.找不到類異常。當應用試圖根據字元串形式的類名構造類,而在遍歷CLASSPAH之後找不到對應名稱的class文件時,拋出該異常。x0dx0ax0dx0ajava.lang.不支持克隆異常。當沒有實現Cloneable介面或者不支持克隆方法時,調用其clone()方法則拋出該異常。x0dx0ax0dx0ajava.lang.x0dx0ax0dx0a枚舉常量不存在異常。當應用試圖通過名稱和枚舉類型訪問一個枚舉對象,但該枚舉對象並不包含常量時,拋出該異常。x0dx0ax0dx0ajava.lang.Exceptionx0dx0ax0dx0a根異常。用以描述應用程序希望捕獲的情況。x0dx0ax0dx0ajava.lang.違法的訪問異常。當應用試圖通過反射方式創建某個類的實例、訪問該類屬性、調用該類方法,而當時又無法訪問類的、屬性的、方法的或構造方法的定義時拋出該異常。x0dx0ax0dx0ajava.lang.違法的監控狀態異常。當某個線程試圖等待一個自己並不擁有的對象(O)的監控器或者通知其他線程等待該對象(O)的監控器時,拋出該異常。x0dx0ax0dx0ajava.lang.違法的狀態異常。當在Java環境和應用尚未處於某個方法的合法調用狀態,而調用了該方法時,拋出該異常。x0dx0ax0dx0ajava.lang.違法的線程狀態異常。當縣城尚未處於某個方法的合法調用狀態,而調用了該方法時,拋出異常。x0dx0ax0dx0ajava.lang.索引越界異常。當訪問某個序列的索引值小於0或大於等於序列大小時,拋出該異常。x0dx0ax0dx0ajava.lang.實例化異常。當試圖通過newInstance()方法創建某個類的實例,而該類是一個抽象類或介面時,拋出該異常。x0dx0ax0dx0ajava.lang.被中止異常。當某個線程處於長時間的等待、休眠或其他暫停狀態,而此時其他的線程通過Thread的interrupt方法終止該線程時拋出該異常。x0dx0ax0dx0ajava.lang.數組大小為負值異常。當使用負數大小值創建數組時拋出該異常。x0dx0ax0dx0ajava.lang.屬性不存在異常。當訪問某個類的不存在的屬性時拋出該異常。x0dx0ax0dx0ajava.lang.方法不存在異常。當訪問某個類的不存在的方法時拋出該異常。x0dx0ax0dx0ajava.lang.空指針異常。當應用試圖在要求使用對象的地方使用了null時,拋出該異常。譬如:調用null對象的實例方法、訪問null對象的屬性、計算null對象的長度、使用throw語句拋出null等等。x0dx0ax0dx0ajava.lang.數字格式異常。當試圖將一個String轉換為指定的數字類型,而該字元串確不滿足數字類型要求的格式時,拋出該異常。x0dx0ax0dx0ajava.lang.RuntimeExceptionx0dx0ax0dx0a運行時異常。是所有Java虛擬機正常操作期間可以被拋出的異常的父類。x0dx0ax0dx0ajava.lang.SecurityExceptionx0dx0ax0dx0a安全異常。由安全管理器拋出,用於指示違反安全情況的異常。x0dx0ax0dx0ajava.lang.x0dx0ax0dx0a字元串索引越界異常。當使用索引值訪問某個字元串中的字元,而該索引值小於0或大於等於序列大小時,拋出該異常。x0dx0ax0dx0ajava.lang.類型不存在異常。當應用試圖
㈢ 在JAVA中已檢查異常和位未檢查異常是什麼二者有何區別
1、含義不同:檢查異常就是編譯器要求你必須處置的異常。不知道你編程的時候有沒有遇到過,你寫的某段代碼,編譯器要求你必須要對這段代碼trycatch,或者throwsexception。
非檢查異常是編譯器不要求強制處置的異常,雖然有可能出現錯誤,但是不會在編譯的時候檢查。
2、運行時情況不同:運行時異常都是RuntimeException類及其子類異常,如NullPointerException(空指針異常)、IndexOutOfBoundsException(下標越界異常)等,這些異常是非檢查異常,程序中可以選擇捕獲處理,也可以不處理。
這些異常一般是由程序邏輯錯誤引起的,程序應該從邏輯角度盡可能避免這類異常的發生。
運行時異常的特點是Java編譯器不會檢查它,也就是說,當程序中可能出現這類異常,即使沒有用try-catch語句捕獲它,也沒有用throws子句聲明拋出它,也會編譯通過。
運行時異常是RuntimeException以外的異常,類型上都屬於Exception類及其子類。從程序語法角度講是必須進行處理的異常,如果不處理,程序就不能編譯通過。
如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不要自定義檢查異常。
3、解決方式不同:檢查異常繼續拋出,消極的方法,一直可以拋到java虛擬機來處理,就是通過throwsexception拋出。用try...catch捕獲。注意,對於檢查的異常必須處理,或者必須捕獲或者必須拋出。
對未檢查的異常捕獲;繼續拋出;不處理。
一般是不處理的,因為你很難判斷會出什麼問題,而且有些異常你也無法運行時處理,比如空指針,需要人手動的去查找,而且,捕捉異常並處理的代價遠遠大於直接拋出。
(3)java檢測異常擴展閱讀:
所有異常類型都是Throwable類的子類,它包含Exception類和Error類,Exception又包括checkedexception和uncheckedexception。
uncheckedexception:Java編譯器不要求對未檢查異常一定捕獲或拋出,可以不做處理。此類異常通常是在邏輯上有錯誤,可以通過修改代碼避免。在eclipse中(保存即編譯)編譯後此類異常發生處會報錯。
checkedexception:Java編譯器要求對檢查異常必須捕獲或拋出,代碼邏輯沒有錯誤,但程序運行時會因為IO等錯誤導致異常,你在編寫程序階段是預料不到的。
如果不處理這些異常,程序將來肯定會出錯。所以編譯器會提示你要去捕獲並處理這種可能發生的異常,不處理就不能通過編譯。