本文轉載自【微信公眾號:五角錢的程式設計師,ID:xianglin965】經微信公眾號授權轉載,如需轉載與原文作者聯繫
一起學習、成長、溫情的熱愛生活
有一種暖男叫catch,有一種真愛叫try—catch,世上最真情的愛戀就是你在try我在catch,無論你發什麼脾氣,我都靜靜的接受,默默地處理,不管你有什麼錯,我都會原諒你,愛著你。
哈哈,那今天就來說一下下關於java的愛情故事吧
先來了解一些異常的知識,看完你就知道它的愛情了
都知道java是面向對象的語言,同樣,它也是運用面向對象的機制來處理異常的,即通過一個個的異常類來分別處理各種各樣的異常。
異常的分類如下圖所示
可以看到異常分為兩大類:
Error
和
Exception
,下面從這兩個方面分別討論
Error是指運行時應用程式較嚴重的問題,程序本身無法恢復的嚴重錯誤,不需要處理。
程序設計的再好,也避免不了外界的影響而引發的一些異常,這就不是異常,而是錯誤了,比如內存不足啦(
OutOfMemoryError
),虛擬機運行錯誤啦(
VirtualMachineError
),線程死鎖等等
Error表明了系統JVM已經處於不可恢復的崩潰邊緣,我們管也沒法管(
悄悄的告訴你:一般情況下遇見不到這些錯誤的,我們也不用太擔心哈,有時重啟一下就好嘍!
)
指java程序本身可以處理的異常事件,例如
ClassCastException
:數據類型轉換異常;
ArithmeticException
(除數為0的異常);
ArrayIndexOutOfBoundsException
(數組下標出界異常);
NullPointerException
(空指針異常);
ClassNotFoundException
(指定類不存在);
InputMismatchExceptionException
(輸入類型不匹配)等等這些的異常異常分為
RuntimeException
CheckedException
注意一點就是咱們現在所說的比如
,
這種是一類異常,它下面可以派生出來好多的異常,是一類,這可不是一個異常,記好啊,下面分別說明一下這兩種異常
運行時異常,例如數組下標越界,空指針異常,除數為0異常,對象轉換異常等,這些異常在編譯器那是檢查不出來的,編譯器有點笨,它只能檢查一些基本的語法錯誤,像這種的邏輯錯誤它是檢查不出的。
這類異常一般不必要用異常機制來處理,我們通常會採用增加邏輯處理來避免這些異常的產生。eg:對於除數為0的異常,我們可以在除數那加上一個if判斷語句,判斷除數是否為0,不為0才讓它執行語句塊中的內容。
不廢話,上代碼
public class Test01 {public static void main(String[] args) { //分母為0異常 int b=0; if(b!=0){ //避免出現java.lang.ArithmeticException異常,給它加個if判斷語句就可以了 System.out.println(1/b); } //空指針異常 String str=null; if(str!=null){ System.out.println(str.charAt(0)); //charAt是提取下標為0的字符,避免出現空指針異常:java.lang.NullPointerException,加一個非空判斷 } //數組下標越界異常 int i[]=new int[5]; int a=5; if(a<i.length){ //避免java.lang.ArrayIndexOutOfBoundsException下標越界異常,增加關於邊界的判斷 System.out.println(i[a]); } //類型轉換錯誤 Animal dog=new Dog(); //強制類型轉換易出現的錯誤(編譯看左,運行看右) if(dog instanceof Cat){ //避免java.lang.ClassCastException類型轉換錯誤,可以用instanceof二元運算符,注意:左邊對象,右邊類 Cat cat=(Cat)dog; } }}class Animal{}class Dog extends Animal{}class Cat extends Animal{}
我們把所有不是RuntimeException的異常都看成為可檢查異常,也就是編譯器異常。
這類異常在編譯時就必須做出處理,否則無法通過編譯
處理這類異常有兩種方式:使用try—catch捕獲異常(java的神仙cp出場啦),使用throws聲明異常
try—catch—finally
我們可以先想一下地鐵的安保機制,是不是乘地鐵的人進去是不是要過一下安檢,假如小王的身上帶了把來福去乘坐地鐵,過安檢的時候機器檢測到他身上有危險物品是不是會發出報警聲,然後地鐵的相關安保人員過來處理這個異常
java的異常處理機制跟地鐵的安保機制也很相似:
try用來檢查異常的語句,如果出現異常,則把異常拋給catch,catch通過異常的類型來捕獲處理它,最後一步是通過finally為異常處理提供一個統一的出口。
要點:
try語句指定了一段代碼,該代碼就是異常捕獲並處理的範圍,在執行過程中,當任意條語句發生異常,則會跳過後面的代碼跳到該異常所對應的catch語句塊中,語句塊執行後不會再返回去執行沒執行的代碼一個try語句至少帶有一個catch語句或一個finaly語句一個try可有多條catch語句,用於處理可能產生不同類型的異常對象catch中異常對象的常用方法toString():顯示異常的類名與產生異常的原因getMessage():只顯示產生異常的原因printStactTrance():用來跟蹤異常事件發生時堆棧的內容catch捕獲異常應遵循子類異常在前,父類異常在後的原則finally所指定的代碼不管是否發生了異常都要被執行,代碼通常是關閉程序塊中已打開的資源,eg:關閉文件流,釋放資源,關閉文件,關閉資料庫等finally最多只能由一條,根據自己的需要可有可無即使try和catch中存在return語句,finally也會執行,是執行完finally語句後再通過return退出上代碼
import java.util.InputMismatchException;import java.util.Scanner;public class Test08 {public static void main(String[] args){ int a,b; System.out.println("請輸入兩個數:"); Scanner myin=new Scanner(System.in); try{//檢測是否有錯誤 a=myin.nextInt();//1.如果輸入的不是int類型,程序出錯。提出問題 b=myin.nextInt(); System.out.println(a/b);//2.除數可能為零 int arr[]={1,2,3,4,5}; System.out.println(arr[5]); //3.數組下標越界 System.out.println("try中的語句"); }catch(InputMismatchException e){ e.printStackTrace();; }catch(ArithmeticException e){ e.printStackTrace(); }catch(ArrayIndexOutOfBoundsException e){ e.printStackTrace(); } System.out.println("程序繼續向下執行:"); }}
代碼中有三處可出現異常提示,可以發現,如果你輸入一個字母的話,它就會在第一個異常處報錯,即
InputMismatchException
(輸入數據類型錯誤),try中後面的它就不會再去執行了;同樣如何我們輸入12,0的話,就會引發第二處異常錯誤,即
(除數為0錯誤),同樣後面語句也不在執行;同樣如果我們前兩處沒有錯誤,就會到第三個地方報錯,即
(數組元素下標越界錯誤);
throws
有一種懶漢員工叫throws,甭管有啥事都往外拋,做錯事了就交給上級擦屁股,上級不會再給上級,給到老闆為止,老闆要是也不會,公司就over了
當
發生時,我們也可以不立即處理它,也可以把這個異常給throws拋出去,也就是「它有異常,誰調它誰來處理」
如果一個方法中產生了某種異常,但是我們不確定如何來處理這種異常,就可以在方法的開頭就聲明出該方法可能拋出的異常
如果一個方法拋出多個異常,就必須在方法的開頭列出所有的異常,用逗號分隔(我感覺throws往上拋異常挺爽的哈哈)
import java.util.Scanner;public class Test08 {public static void main(String[] args) throws Exception{//我再把異常往上拋,拋給main方法,main方法再拋就要拋給虛擬機,讓虛擬機給你處理 myTest(); } public static void myTest() throws Exception{//我太懶了,就直接用個Exception給全部異常包含住了哈哈 int a,b; System.out.println("請輸入兩個數:"); Scanner myin=new Scanner(System.in); a=myin.nextInt();//1.如果輸入的不是int類型,程序出錯。提出問題 b=myin.nextInt(); System.out.println(a/b);//2.除數可能為零 int arr[]={1,2,3,4,5}; System.out.println(arr[5]); //3.數組下標越界 System.out.println("try中的語句"); System.out.println("程序繼續向下執行:"); }