一面試官問到java 異常怎麼劃分?我回答error 和exception.Exception是分爲什麼?
我回答編譯時異常和運行時異常。面試官接下來讓我對兩者舉個例子。我混亂了,只知道一些能說出來的異常,卻不知道他們屬於編譯時異常還是運行時異常。通過網上查資料線面做個總結:
異常分爲 error 和Exception
Error
當程序發生不可控的錯誤時,通常做法是通知用戶並中止程序的執行。與異常不同的是Error及其子類的對象不應被拋出。
Error是throwable的子類,代表編譯時間和系統錯誤,用於指示合理的應用程序不應該試圖捕獲的嚴重問題。
Error由Java虛擬機生成並拋出,包括動態鏈接失敗,虛擬機錯誤等。程序對其不做處理。
我們比較熟悉 的內存溢出。outofMemory
Exception 分爲CheckedException和RunntimeException
①Checked異常(編譯期異常)
只有java語言提供了Checked異常。java認爲Checked異常都是可以被處理的異樣,所以java程序必須顯式的處理Checked異常。如果程序沒有處理Checked異常,該程序在編譯時就會發生錯誤無法編譯。這體現了Java的設計哲學;對Checked異常處理的方法有兩種:
1.當前方法知道如何出來異常,則用try....catch塊來處理該異常。
2.當前方法不知道如何處理,則在定義該方法時聲明拋出該異常。
我們比較熟悉的Checked的異常有:
Java.lang.ClassNotFoundException(類找不到)
Java.lang.NoSuchMethodException(找不到方法)
Java.io.IoException(IO異常)
②RuntimeException(運行時異常)
Runtime如除數是0和數組下標越界等,其產生頻繁,處理麻煩,若顯示申明或者捕獲將會對程序的可讀性和運行效率影響很 大。 所以由系統自動檢測並將它們交給缺省的異常處理程
序。當然如果你有處理要求也可以顯示捕獲它們。
我們比較熟悉的RumtimeException類的子類有
Java.lang.ArithmeticException(算術異常)
Java.lang.ClassCastException (類型轉換異常)
Java.lang.IndexOutOfBoundsException(數組越界異常)
Java.lang.NullPointerException(空指針異常)
下面說說異常這塊的throw 和throws的區別
處理異常一般分爲三種:
1.直接在catch語句裏面處理。
2.不管會發生什麼異常直接拋給調用者 寫法就是在聲明方法的後面加上throws Exception
3.自定義的異常。通過throw 關鍵字拋出異常 然後通過在方法的後面加上throws Exception 把自定義的異常拋給調用者。
throw語句用在方法體內,表示拋出異常,由方法體內的語句處理。
throws語句用在方法聲明後面,表示再拋出異常,由該方法的調用者來處理。
throws主要是聲明這個方法會拋出這種類型的異常,使它的調用者知道要捕獲這個異常。有可能會有多個異常 不管什麼異常直接扔給調用者處理。
throw是具體向外拋異常的動作,所以它是拋出一個異常實例。throw拋出的是自己定義好的異常。
if(a!=b)
throw new Exception3("自定義異常");
一旦使用了throw 拋出具體的異常,聲明方法的時候要用throws來扔給調用者。