您好,登錄后才能下訂單哦!
這篇文章主要介紹了Java異常處理機制有什么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
異常:在Java語言中,將程序執行中發生的不正常情況稱為“異常”。 (開發過程中的語法錯誤和邏輯錯誤不是異常)
Java程序在執行過程中所發生的異常事件可分為兩類:
Error:Java虛擬機無法解決的嚴重問題。如:JVM系統內部錯誤、資源耗盡等嚴重情況。比如:StackOverflowError和OOM。一般不編寫針對性
的代碼進行處理。
Exception: 其它因編程錯誤或偶然的外在因素導致的一般性問題,可以使
用針對性的代碼進行處理。
例如:
空指針訪問試圖讀取不存在的文件網絡連接中斷數組角標越界
對于這些錯誤,一般有兩種解決方法:一是遇到錯誤就終止程序
的運行。另一種方法是由程序員在編寫程序時,就考慮到錯誤的
檢測、錯誤消息的提示,以及錯誤的處理。
捕獲錯誤最理想的是在編譯期間,但有的錯誤只有在運行時才會發生。
比如:除數為0,數組下標越界等
分類:編譯時異常和運行時異常
1.運行時異常
是指編譯器不要求強制處置的異常。一般是指編程時的邏輯錯誤,是程序
員應該積極避免其出現的異常。java.lang.RuntimeException類及它的子
類都是運行時異常。
對于這類異常,可以不作處理,因為這類異常很普遍,若全處理可能會對
程序的可讀性和運行效率產生影響。
2.編譯時異常
是指編譯器要求必須處置的異常。即程序在運行時由于外界因素造成的一
般性異常。編譯器要求Java程序必須捕獲或聲明所有編譯時異常。
l 對于這類異常,如果程序不處理,可能會帶來意想不到的結果。
java.lang.RuntimeException
ClassCastExceptionArrayIndexOutOfBoundsExceptionNullPointerExceptionArithmeticExceptionNumberFormatExceptionInputMismatchException
java.io.IOExeption
FileNotFoundExceptionEOFException
java.lang.ClassNotFoundException
java.lang.InterruptedException
java.io.FileNotFoundException
java.sql.SQLException
public class IndexOutExp { public static void main(String[] args) { String friends[] = { "lisa", "bily", "kessy" }; for (int i = 0; i < 5; i++) { System.out.println(friends[i]); // friends[4]? } System.out.println("\nthis is the end"); }}
運行結果:數組越界異常
public class NullRef{ int i = 1; public static void main(String[] args){ NullRef t = new NullRef(); t = null; System.out.println(t.i); } }
運行結果:空指針異常
public class DivideZero{ int x; public static void main(String[] args){ int y; DivideZero c=new DivideZero(); y=3/c.x; System.out.println("program ends ok!"); }}
運行結果:除零異常
public class Order{ public static void main(String[] args){ Object obj = new Date(); Order order; order = (Order) obj; System.out.println(order); }}
運行結果:類轉換異常
Java提供的是異常處理的抓拋模型
拋出異常
Java程序的執行過程中如出現異常,會生成一個異常類對象,該異常對象將被提交給Java運行時系統,這個過程稱為拋出(throw)異常。
異常對象的生成
由虛擬機自動生成:程序運行過程中,虛擬機檢測到程序發生了問題,如果在當前代碼中沒有找到相應的處理程序,就會在后臺自動創建一個對應異常類的實例對象并拋出——自動拋出由開發人員手動創建:Exception exception = new ClassCastException();——創建好的異常對象不拋出對程序沒有任何影響,和創建一個普通對象一樣
異常的拋出機制:
捕獲異常
如果一個方法內拋出異常,該異常對象會被拋給調用者方法中處理。如果異常沒有在調用者方法中處理,它繼續被拋給這個調用方法的上層方法。這個過程將一直繼續下去,直到異常被處理。這一過程稱為捕獲(catch)異常。
如果一個異常回到main()方法,并且main()也不處理,則程序運
行終止。
程序員通常只能處理Exception,而對Error無能為力。
異常處理是通過try-catch-finally語句實現的
try{...... //可能產生異常的代碼}catch( ExceptionName1 e ){...... //當產生ExceptionName1型異常時的處置措施}catch( ExceptionName2 e ){...... //當產生ExceptionName2型異常時的處置措施}[ finally{...... //無論是否發生異常,都無條件執行的語句} ]
try
捕獲異常的第一步是用try{…}語句塊選定捕獲異常的范圍,將可能出現
異常的代碼放在try語句塊中。
catch (Exceptiontype e)
在catch語句塊中是對異常對象進行處理的代碼。每個try語句塊可以伴隨
一個或多個catch語句,用于處理可能產生的不同類型的異常對象。
finally
捕獲異常的最后一步是通過finally語句為異常處理提供一個
統一的出口,不論在try代碼塊中是否發生了異常事件,catch語句是否執
行,catch語句是否有異常,catch語句中是否有return,finally塊中的語句都會被執行。
捕獲異常的有關信息:
與其它對象一樣,可以訪問一個異常對象的成員變量或調用它的
方法。
getMessage() 獲取異常信息,返回字符串printStackTrace() 獲取異常類名和異常信息,以及異常出現在程序中的位置。返回值void。
舉例:指針越界
public class IndexOutExp{ public static void main(String[] args){ String friends[] = { "lisa", "bily", "kessy" }; try{ for (int i = 0; i < 5; i++) { System.out.println(friends[i]); } }catch (ArrayIndexOutOfBoundsException e){ System.out.println("index err"); } System.out.println("\nthis is the end"); }}//程序IndexOutExp.java運行結果:java IndexOutExplisabilykessyindex errthis is the end
一般地,用戶自定義異常類都是RuntimeException的子類。
自定義異常類通常需要編寫幾個重載的構造器。 l 自定義異常需要提供serialVersionUID自定義的異常通過throw拋出。自定義異常最重要的是異常類的名字,當異常出現時,可以根據名字判斷異常類型。
用戶自定義異常類MyException,用于描述數據取值范圍錯誤信息。用戶
自己的異常類必須繼承現有的異常類
public class Test { private static String userName = "admin"; private static String password = "123456"; public static void main(String[] args) { login("admin", "123456"); } public static void login(String userName, String password) { if (!Test.userName.equals(userName)) { // TODO 處理用戶名錯誤 } if (!Test.password.equals(password)) { // TODO 處理密碼錯誤 } System.out.println("登陸成功"); } }
此時我們在處理用戶名密碼錯誤的時候可能就需要拋出兩種異常. 我們可以基于已有的異常類進行擴展(繼承), 創建和我們業務相關的異常類
class UserError extends Exception { public UserError(String message) { super(message); } } class PasswordError extends Exception { public PasswordError(String message) { super(message); } }
此時我們的 login 代碼可以改成
public static void main(String[] args) { try { login("admin", "123456"); } catch (UserError userError) { userError.printStackTrace(); } catch (PasswordError passwordError) { passwordError.printStackTrace(); } } public static void login(String userName, String password) throws UserError, PasswordError { if (!Test.userName.equals(userName)) { throw new UserError("用戶名錯誤"); } if (!Test.password.equals(password)) { throw new PasswordError("密碼錯誤"); } System.out.println("登陸成功"); }
注意事項:
自定義異常通常會繼承自 Exception 或者 RuntimeException
繼承自 Exception 的異常默認是受查異常
繼承自 RuntimeException 的異常默認是非受查異常
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Java異常處理機制有什么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。