1. 程式人生 > >java中異常的面試

java中異常的面試

https://blog.csdn.net/qq_36523638/article/details/79363652

1) Java中的檢查型異常和非檢查型異常有什麼區別?

  這又是一個非常流行的Java異常面試題,會出現在各種層次的Java面試中。檢查型異常和非檢查型異常的

主要區別在於其處理方式。檢查型異常需要使用try, catch和finally關鍵字在編譯期進行處理,否則會出現編譯

器會報錯。對於非檢查型異常則不需要這樣做。Java中所有繼承自java.lang.Exception類的異常都是檢查型

異常,所有繼承自RuntimeException的異常都被稱為非檢查型異常。你也可以檢視下一篇文章來了解

 更多關於檢查型異常和非檢查型異常之間的區別。

2)Java中什麼是Exception?

  這個問題經常在第一次問有關異常的時候或者是面試菜鳥的時候問。我從來沒見過面高階或者資深工程師的

時候有人問這玩意,但是對於菜鳥,是很願意問這個的。簡單來說,異常是Java傳達給你的系統和程式錯誤的方

式。在java中,異常功能是通過實現比如Throwable,Exception,RuntimeException之類的類,然後還有一

些處理異常時候的關鍵字,比如throw,throws,try,catch,finally之類的。 所有的異常都是通過Throwable

衍生出來的。Throwable把錯誤進一步劃分為 java.lang.Exception 和 java.lang.Error.  java.lang.Error 用

來處理系統錯誤,例如java.lang.StackOverFlowError 或者 Java.lang.OutOfMemoryError 之類的。然後

 Exception用來處理程式錯誤,請求的資源不可用等等。

3)在Java異常處理的過程中,你遵循的那些最好的實踐是什麼?

這個問題在面試技術經理是非常常見的一個問題。因為異常處理在專案設計中是非常關鍵的,所以精通異常處

理是十分必要的。異常處理有很多最佳實踐,下面列舉集中,它們提高你程式碼的健壯性和靈活性:

1) 呼叫方法的時候返回布林值來代替返回null,這樣可以 NullPointerException。由於空指標是java異常裡最惡

心的異常。

2) catch塊裡別不寫程式碼。空catch塊是異常處理裡的錯誤事件,因為它只是捕獲了異常,卻沒有任何處理或者

提示。通常你起碼要打印出異常資訊,當然你最好根據需求對異常資訊進行處理。

3)能拋受控異常(checked Exception)就儘量不拋受非控異常(checked Exception)。通過去掉重複的異常處

理程式碼,可以提高程式碼的可讀性。

4) 絕對不要讓你的資料庫相關異常顯示到客戶端。由於絕大多數資料庫和SQLException異常都是受控異常,在Java中,

你應該在DAO層把異常資訊處理,然後返回處理過的能讓使用者看懂並根據異常提示資訊改正操作的異常資訊。

5) 在Java中,一定要在資料庫連線,資料庫查詢,流處理後,在finally塊中呼叫close()方法。

4) Java中的NullPointerException和ArrayIndexOutOfBoundException之間有什麼相同之處?

  在Java異常面試中這並不是一個很流行的問題,但會出現在不同層次的初學者面試中,用來測試應聘者對檢查

型異常和非檢查型異常的概念是否熟悉。順便說一下,該題的答案是,這兩個異常都是非檢查型異常,都繼承自RuntimeException。該問題可能會引出另一個問題,即Java和C的陣列有什麼不同之處,因為C裡面的陣列是沒有

大小限制的,絕對不會丟擲ArrayIndexOutOfBoundException。

5) 既然我們可以用RuntimeException來處理錯誤,那麼你認為為什麼Java中還存在檢查型異常?

  這是一個有爭議的問題,在回答該問題時你應當小心。雖然他們肯定願意聽到你的觀點,但其實他們最感興

趣的還是有說服力的理由。我認為其中一個理由是,存在檢查型異常是一個設計上的決定,受到了諸如C++等比

Java更早的程式語言設計經驗的影響。絕大多數檢查型異常位於java.io包內,這是合乎情理的,因為在你請求了

不存在的系統資源的時候,一段強壯的程式必須能夠優雅的處理這種情況。通過把IOException宣告為檢查型異

常,Java 確保了你能夠優雅的對異常進行處理。另一個可能的理由是,可以使用catch或finally來確保數量受限

的系統資源(比如檔案描述符)在你使用後儘早得到釋放。
 

6)  throw 和 throws這兩個關鍵字在java中有什麼不同?

一個java初學者應該掌握的面試問題。 throw 和 throws乍看起來是很相似的尤其是在你還是一個java初學者的時

候。儘管他們看起來相似,都是在處理異常時候使用到的。但在程式碼裡的使用方法和用到的地方是不同的。throws

總是出現在一個函式頭中,用來標明該成員函式可能丟擲的各種異常, 你也可以申明未檢查的異常,但這不是編譯

器強制的。如果方法丟擲了異常那麼呼叫這個方法的時候就需要將這個異常處理。另一個關鍵字  throw 是用來

丟擲任意異常的,按照語法你可以丟擲任意 Throwable (i.e. Throwable 或任何Throwable的衍生類) , throw

可以中斷程式執行,因此可以用來代替return . 最常見的例子是用 throw 在一個空方法中需要return的地方丟擲 UnSupportedOperationException 程式碼如下 :

 
1     private static voidshow() {  
2          throw new UnsupportedOperationException(“Not yet implemented”);
3      }

7) 什麼是“異常鏈”?

  “異常鏈”是Java中非常流行的異常處理概念,是指在進行一個異常處理時丟擲了另外一個異常,由此產生

了一個異常鏈條。該技術大多用於將“ 受檢查異常” ( checked exception)封裝成為“非受檢查異常”

(unchecked exception)或者RuntimeException。順便說一下,如果因為因為異常你決定丟擲一個新的異常,

你一定要包含原有的異常,這樣,處理程式才可以通過getCause()和initCause()方法來訪問異常最終的根源。

8) 你曾經自定義實現過異常嗎?怎麼寫的?

  很顯然,我們絕大多數都寫過自定義或者業務異常,像AccountNotFoundException。在面試過程中詢問

這個Java異常問題的主要原因是去發現你如何使用這個特性的。這可以更準確和精緻的去處理異常,當然這也跟

你選擇checked 還是unchecked exception息息相關。通過為每一個特定的情況建立一個特定的異常,你就為

呼叫者更好的處理異常提供了更好的選擇。相比通用異常(general exception),我更傾向更為精確的異常。大

量的建立自定義異常會增加專案class的個數,因此,在自定義異常和通用異常之間維持一個平衡是成功的關鍵。

9) JDK7中對異常處理做了什麼改變?

 
  這是最近新出的Java異常處理的面試題。JDK7中對錯誤(Error)和異常(Exception)處理主要新增加了2個特性,

一是在一個catch塊中可以出來多個異常,就像原來用多個catch塊一樣。另一個是自動化資源管理(ARM), 也稱為

try-with-resource塊。這2個特性都可以在處理異常時減少程式碼量,同時提高程式碼的可讀性。對於這些特性瞭解,

不僅幫助開發者寫出更好的異常處理的程式碼,也讓你在面試中顯的更突出。我推薦大家讀一下Java 7攻略,這樣

可以更深入的瞭解這2個非常有用的特性。

10) 你遇到過 OutOfMemoryError 錯誤嘛?你是怎麼搞定的?

  這個面試題會在面試高階程式設計師的時候用,面試官想知道你是怎麼處理這個危險的OutOfMemoryError錯誤的。

必須承認的是,不管你做什麼專案,你都會碰到這個問題。所以你要是說沒遇到過,面試官肯定不會買賬。要是

你對這個問題不熟悉,甚至就是沒碰到過,而你又有3、4年的Java經驗了,那麼準備好處理這個問題吧。在回答

這個問題的同時,你也可以藉機向面試秀一下你處理記憶體洩露、調優和除錯方面的牛逼技能。我發現掌握這些技

術的人都能給面試官留下深刻的印象。

 
11) 如果執行finally程式碼塊之前方法返回了結果,或者JVM退出了,finally塊中的程式碼還會執行嗎?

  這個問題也可以換個方式問:“如果在try或者finally的程式碼塊中呼叫了System.exit(),結果會是怎樣”。

瞭解finally塊是怎麼執行的,即使是try裡面已經使用了return返回結果的情況,對了解Java的異常處理都非常

有價值。只有在try裡面是有System.exit(0)來退出JVM的情況下finally塊中的程式碼才不會執行。

 
12)Java中final,finalize,finally關鍵字的區別

 
  這是一個經典的Java面試題了。我的一個朋友為Morgan Stanley招電信方面的核心Java開發人員的時候就

問過這個問題。final和finally是Java的關鍵字,而finalize則是方法。final關鍵字在建立不可變的類的時候

非常有用,只是宣告這個類是final的。而finalize()方法則是垃圾回收器在回收一個物件前呼叫,但也Java規

範裡面沒有保證這個方法一定會被呼叫。finally關鍵字是唯一一個和這篇文章討論到的異常處理相關的關鍵字。

在你的產品程式碼中,在關閉連線和資原始檔的是時候都必須要用到finally塊。

13)下面的程式碼都有哪些錯誤:

01     public static void start() throws IOException, RuntimeException{
02      
03        throw new RuntimeException(“Not able to Start”);
04     }
05      
06     public static void main(String args[]) {
07        try {
08              start();
09        } catch (Exception ex) {
10                ex.printStackTrace();
11        } catch (RuntimeException re) {
12                re.printStackTrace();
13        }
14     }

  這段程式碼會在捕捉異常程式碼塊的RuntimeException型別變數“re”裡丟擲編譯異常錯誤。因為Exception是RuntimeException的超類,在start方法中所有的RuntimeException會被第一個捕捉異常塊捕捉,這樣就無法到

達第二個捕捉塊,這就是丟擲“exception java.lang.RuntimeException has already been caught”的編譯錯誤原因。
---------------------
作者:東風削鐵蟲
來源:CSDN
原文:https://blog.csdn.net/qq_36523638/article/details/79363652?utm_source=copy
版權宣告:本文為博主原創文章,轉載請附上博文連結!

相關推薦

java異常面試

https://blog.csdn.net/qq_36523638/article/details/79363652 1) Java中的檢查型異常和非檢查型異常有什麼區別?   這又是一個非常流行的Java異常面試題,會出現在各種層次的Java面試中。檢查型異常和非檢查型異常的 主要區別在於其處理方式。檢查型

java異常處理機制 throw拋出自定義業務邏輯異常 throws繼續拋出 catch捕獲後會自動繼續拋向調用方法

異常處理機制 ... cep super finally sta exc ace 避免 package com.swift; public class Exception_TestC { public static void main(String[] arg

java異常(Exception)的定義,意義和用法。舉例

use 詳情 put 視頻下載 ati itl url index ring 1.異常(Exception)的定義,意義和用法 (視頻下載) (全部書籍) 我們先給出一個例子,看看異常有什麽用? 例:1.1-本章源碼 public class Test { publi

java異常這種技術框架是怎麽工作的?

行程 html gin 視頻 down sun公司 win works tro 異常這種技術框架是怎麽工作的?【新手可忽略不影響繼續學習】 (視頻下載) (全部書籍)馬克-to-win:註意是運行程序時,而不是編譯時,當一個非正常情況出現,比如除0,就叫異常情況。馬克-to

java異常的理解

排序 leg ted 詳細 clas 訪問 基本 finally 返回 Trowable是所有異常的超類,對應的底下有兩個子類,Error和Exception,java中的異常其實總體上來說有三種類型: 一、檢查性異常,程序在編譯的時候出現的異常,例如打開一個文件,此時程

JAVA異常狀況總結

中一 finally throws sys owa pri 出現異常 兩個 問題 之前在《會當淩絕頂》這本書中學到過對於異常處理的知識,當時也是根據書上的代碼,自己進行編寫大概知道是怎麽回事兒,王老師給我們上了一節課之後,發現異常處理可以發揮很大的作用。 通過在網絡上搜索

Java異常的捕獲順序(多個catch)

import java.io.IOException; public class ExceptionTryCatchTest { public void doSomething() throws IOException{ System.out.println("do

java異常以及處理異常

一、異常簡介 什麼是異常? 異常就是有異於常態,和正常情況不一樣,有錯誤出錯。在java中,阻止當前方法或作用域的情況,稱之為異常。 java中異常的體系是怎麼樣的呢? 1.Java中的所有不正常類都繼承於Throwable類。Throwable主要包括兩個大類,一個是Error類,另一個是Excep

java異常正確寫法(詳細)

程式執行時,發生的不被期望的事件,它阻止了程式按照程式設計師的預期正常執行,這就是異常。異常發生時,是任程式自生自滅,立刻退出終止,還是輸出錯誤給使用者?或者用C語言風格:用函式返回值作為執行狀態?。 Java提供了更加優秀的解決辦法:異常處理機制。 異常處理機制能讓程式

JAVA 異常處理的最佳實踐

前言 異常處理的問題之一是知道何時以及如何去使用它。我會討論一些異常處理的最佳實踐,也會總結最近在異常處理上的一些爭論。 作為程式設計師,我們想要寫高質量的能夠解決問題的程式碼。但是,異常經常是伴隨著程式碼產生的副作用。沒有人喜歡副作用,因此我們會試圖用自己的方式來解決這

【詳】JAVA異常分類以及異常處理方法之間的區別以及聯絡

異常在日長開發中就像看見地鐵裡邊的人頭一樣的,放眼望去,齊刷刷的一片,各種異常。分佈範圍比較廣泛,很多人看到異常,就這表情 JAVA中異常: NullPointerException 空指標異常

關於對Java異常處理的try catch和throw的理解(淺顯理解)

一.try catch方法   A.什麼try catch 方法     try catch是異常處理中一種方法,檢測並捕捉異常然後進行處理     try是檢測異常,catch是捕捉異常   B try catch的三種格式   格式1   try{     語句體;   }catch{    

[思維導圖]Java異常的分類整理

父類:Throwable Throwable是所有異常的父類,位於:java.lang.Throwable Java的異常(包括Exception和Error)分為可查的異常(ch

深入理解Java異常體系

任何程式都追求正確有效的執行,除了保證我們程式碼儘可能的少出錯之外,我們還要考慮如何有效的處理異常,一個良好的異常框架對於系統來說是至關重要的。最近在給公司寫採集框架的時候系統的瞭解一邊,收穫頗多,特此記錄相關的理論。1 .異常體系簡介:異常是指由於各種不期而至的情況,導致程式中斷執行的一種指令流,如:檔案找

Java異常的處理

Java中的異常 分為Error和Exception,其中Error是指Java虛擬機器無法解決的嚴重問題,Exception是指外在因素導致的一般性問題,這裡我們討論的是Exception。 常見的Exception 有空指標異常、陣列下標越界異常、

Java異常處理方法總結

Java中常用的異常處理有3中方式: 1.try {} catche{} try...catch 適合處理程式設計師可以控制和使用者輸入有誤的情況,把認為可能會出現異常的程式碼放到try後面的{},異常後執行的程式碼放到catche的{}裡面,catche的{}後面的語句正

Java異常的總結

根據上面的層次圖,異常類包括Error和Exception兩大類 Error類異常主要是執行時邏輯錯誤導致,一個正確程式中是不應該出現error的。當出現error一般jvm會終止。 Excep

JAVA學習】——JAVA異常及其處理

        首先在瞭解異常的概念之前,需要了解一下異常和普通問題:對於普通的問題在編譯上是語法錯誤,而相較之異常則是在執行時邏輯產生的錯誤,往往產生異常。當然這是表面的理解。         普通問題是指:在當前環境下不能得到足夠的資訊,比如語法錯誤,此時錯誤將會向外傳

java異常與try catch finally詳解(轉載)

簡介程式執行時,發生的不被期望的事件,它阻止了程式按照程式設計師的預期正常執行,這就是異常。異常發生時,是任程式自生自滅,立刻退出終止,還是輸出錯誤給使用者?或者用C語言風格:用函式返回值作為執行狀態?。Java提供了更加優秀的解決辦法:異常處理機制。異常處理機制能讓程式在異

java異常處理finally和return語句的執行順序

finally程式碼塊的語句在return之前一定會得到執行 如果try塊中有return語句,finally程式碼塊沒有return語句,那麼try塊中的return語句在返回之前會先將要返回的值儲存,之後執行finally程式碼塊,最後將儲存的返回值返回,