Java異常處理面試題歸納,java異常處理試題
1、error和exception有什麼區別
error表示系統級的錯誤,是java運行環境內部錯誤或者硬體問題,不能指望程式來處理這樣的問題,除了退出運行外別無選擇,它是Java虛擬機器拋出的。
exception 表示程式需要捕捉、需要處理的異常,是由與程式設計的不完善而出現的問題,程式必須處理的問題
2、運行時異常和一般異常有何不同
Java提供了兩類主要的異常:runtimeException和checkedException
一般異常(checkedException)主要是指IO異常、SQL異常等。對於這種異常,JVM要求我們必須對其進行cathc處理,所以,面對這種異常,不管我們是否願
意,都是要寫一大堆的catch塊去處理可能出現的異常。
運行時異常(runtimeException)我們一般不處理,當出現這類異常的時候程式會由虛擬機器接管。比如,我們從來沒有去處理過NullPointerException,而且
這個異常還是最常見的異常之一。
出現運行時異常的時候,程式會將異常一直向上拋,一直拋到遇到處理代碼,如果沒有catch塊進行處理,到了最上層,如果是多線程就有Thread.run()拋出,如
果不是多線程那麼就由main.run()拋出。拋出之後,如果是線程,那麼該線程也就終止了,如果是主程式,那麼該程式也就終止了。
其實運行時異常的也是繼承自Exception,也可以用catch塊對其處理,只是我們一般不處理罷了,也就是說,如果不對運行時異常進行catch處理,那麼結果不
是線程退出就是主程式終止。
如果不想終止,那麼我們就必須捕獲所有可能出現的運行時異常。如果程式中出現了異常資料,但是它不影響下面的程式執行,那麼我們就該在catch塊裡面將異
常資料捨棄,然後記錄日誌。如果,它影響到了下面的程式運行,那麼還是程式退出比較好些。
3、Java中異常處理機制的原理
Java通過物件導向的方式對異常進行處理,Java把異常按照不同的類型進行分類,並提供了良好的介面。在Java中,每個異常都是一個對象,它都是Throwable
或其子類的執行個體。當一個方法出現異常後就會拋出一個異常對象,該對象中包含有異常資訊,調用這個對象的方法可以捕獲到這個異常並對異常進行處理。Java的
異常處理是通過5個關鍵詞來實現的:try catch throw throws finally。
一般情況下是用try來執行一段程式,如果出現異常,系統會拋出(throws),我們可以通過它的類型來捕捉它,或最後由預設處理器來處理它(finally)。
try:用來指定一塊預防所有異常的程式
catch:緊跟在try後面,用來捕獲異常
throw:用來明確的拋出一個異常
throws:用來標明一個成員函數可能拋出的各種異常
finally:確保一段代碼無論發生什麼異常都會被執行的一段代碼。
4、你平時在項目中是怎樣對異常進行處理的。
(1)盡量避免出現runtimeException 。例如對於可能出現null 指標的代碼,帶使用對象之前一定要判斷一下該對象是否為空白,必要的時候對runtimeException
也進行try catch處理。
(2)進行try catch處理的時候要在catch代碼塊中對異常資訊進行記錄,通過調用異常類的相關方法擷取到異常的相關資訊,返回到web端,不僅要給使用者良好
的使用者體驗,也要能協助程式員良好的定位異常出現的位置及原因。例如,以前做的一個項目,程式遇到異常頁面會顯示一個圖片告訴使用者哪些操作導致程式出現
了什麼異常,同時圖片上有一個按鈕用來點擊展示異常的詳細資料給程式員看的。
5、final、finally、finalize的區別
(1)、final用於聲明變數、方法和類的,分別表示變數值不可變,方法不可覆蓋,類不可以繼承
(2)、finally是異常處理中的一個關鍵字,表示finally{}裡面的代碼一定要執行
(3)、finalize是Object類的一個方法,在記憶體回收的時候會調用被回收對象的此方法。
6、try()裡面有一個return語句,那麼後面的finally{}裡面的code會不會被執行,什麼時候執行,是在return前還是return後?
自己寫了個代碼測試了一下:
public class finallyDemo
public static void main(String[] args) {int i=getInt();System.out.println(i);}private static int getInt() {// TODO Auto-generated method stubtry {return 0;} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{return 1;}}}顯示輸出結果為1,記住就行了,不想去鑽這個問題的牛角尖,也沒有什麼大用處。
java異常處理小知識
這兩種都屬于格式異常,java把這兩種都歸納為 java.lang.NumberFormatException
所以:
try {
int number = Integer.parseInt(str);
} catch (NumberFormatException e) {
e.printStackTrace();
}
java面試題
List,Set都繼承Collection介面,Map不繼承。List,Set都不含索引值對,即儲存資料的方式一般為list.add(value); set.add(value);而Map含有索引值對,可以定義鍵名稱,如:map.put("key",value)。
List的元素可以重複,Set內的元素不可重複,Map也可以重複。
List為線性排序,Set無排序,Map也無排序。
ArrayList:底層用數組實現的List 特點:查詢效率高,增刪效率低 輕量級 線程不安全
LinkedList:底層用雙向迴圈鏈表 實現的List 特點:查詢效率低,增刪效率高
throws為函數拋出異常,通常跟在方法後面,如:public void function() throws Exception{}
throws的異常可在try{}catch(Exception e){}中捕獲,可輸出異常資訊
throw為拋出異常,可根據開發人員自訂需要在指定位置手工拋出異常,通常寫在函數體中
try{}函數內部為需要執行捕獲的事務,通常和catch何用,作為異常處理,finally為最終執行方法無論是否發生異常finally內部的代碼都會執行
java可使用try....catch...finally的方式對異常進行捕獲,樣本如下
/**捕獲異常測試方法**/ public void testCatch(){ try{ testThrow();//在try catch中捕獲拋出異常 }catch(Exception ex){ ex.printStack();//控制台輸出捕獲的異常資訊 System.Out.println("Exception"+e.getMessage()); //e.getMessage為異常摘要 }finally{ System.our.println("Finally");//這裡無論是否拋出異常都會執行 }}/**拋出異常測試方法**/public void testThrow() throws Exception{ new throw Exception("自訂拋出異常");}