已經是金九銀十了,雖說今年行情很不好,但是該來的還是要來,該面對還是要面對,小編準備搞個金九銀十面試篇,把手頭上有的面試題及答案分享給大家,這篇文章只整理了Java例外和IO和NIO的面試題,同時也整理了其他面試題在手里,與其吃灰還不如分享給大家,
需要的朋友可以點擊:點這個!點這個!暗號:csdn

Java例外面試篇
1、Java中例外分為哪兩種?
編譯時例外
運行時例外
2、例外的處理機制有幾種?
例外捕捉:try…catch…finally
例外拋出:throws,
3、如何自定義一個例外
繼承一個例外類,通常是RumtimeException或者Exception
4、try catch fifinally,try里有return,finally還執行么?
執行,并且finally的執行早于try里面的return
結論:
(1)不管有木有出現例外,finally塊中代碼都會執行;
(2)當try和catch中有return時,finally仍然會執行;
(3)finally是在return后面的運算式運算后執行的(此時并沒有回傳運算后的值,而是先把要回傳的值保存起來,管finally中的代碼怎么樣,回傳的值都不會改變,任然是之前保存的值),所以函式回傳值是在finally執行前確定的;(4)finally中最好不要包含return,否則程式會提前退出,回傳值不是try或catch中保存的回傳值,
5、 Excption與Error包結構
Java可拋出(Throwable)的結構分為三種型別:被檢查的例外(CheckedException),運行時例外(RuntimeException),錯誤(Error),
(1)運行時例外
定義:RuntimeException及其子類都被稱為運行時例外,
特點:
Java編譯器不會檢查它,也就是說,當程式中可能出現這類例外時,倘若既"沒有通過throws宣告拋出它",也"沒有用try-catch陳述句捕獲它",還是會編譯通過,例如,除數為零時產生的ArithmeticException例外,陣列越界時產生的IndexOutOfBoundsException例外,fail-fast機制產生的ConcurrentModi?cationException例外(java.util包下面的所有的集合類都是快速失敗的,“快速失敗”也就是fail-fast,它是Java集合的一種錯誤檢測機制,當多個執行緒對集合進行結構上的改變的操作時,有可能會產生fail-fast機制,記住是有可能,而不是一定,
例如:
假設存在兩個執行緒(執行緒1、執行緒2),執行緒1通過Iterator在遍歷集合A中的元素,在某個時候執行緒2修改了集合A的結構(是結構上面的修改,而不是簡單的修改集合元素的內容),那么這個時候程式就會拋出ConcurrentModi?cationException 例外,從而產生fail-fast機制,這個錯叫并發修改例外,
Fail-safe,java.util.concurrent包下面的所有的類都是安全失敗的,在遍歷程序中,如果已經遍歷的陣列上的內容變化了,迭代器不會拋出ConcurrentModi?cationException例外,如果未遍歷的陣列上的內容發生了變化,則有可能反映到迭代程序中,這就是ConcurrentHashMap迭代器弱一致的表現,ConcurrentHashMap的弱一致性主要是為了提升效率,是一致性與效率之間的一種權衡,要成為強一致性,就得到處使用鎖,甚至是全域鎖,這就與Hashtable和同步的HashMap一樣了,)等,都屬于運行時例外,
常見的五種運行時例外:
ClassCastException(類轉換例外)
IndexOutOfBoundsException(陣列越界)
NullPointerException(空指標例外)
ArrayStoreException(資料存盤例外,操作陣列是型別不一致)
Bu?erOver?owException
(2)被檢查例外
定義:Exception類本身,以及Exception的子類中除了"運行時例外"之外的其它子類都屬于被檢查例外,特點 : Java編譯器會檢查它,此類例外,要么通過throws進行宣告拋出,要么通過try-catch進行捕獲處理,否則不能通過編譯,例如,CloneNotSupportedException就屬于被檢查例外,當通過clone()介面去克隆一個物件,而該物件對應的類沒有實作Cloneable介面,就會拋出CloneNotSupportedException例外,被檢查例外通常都是可以恢復的,
如:
IOException
FileNotFoundException
SQLException
被檢查的例外適用于那些不是因程式引起的錯誤情況,比如:讀取檔案時檔案不存在引發的FileNotFoundException ,然而,不被檢查的例外通常都是由于糟糕的編程引起的,比如:在物件參考時沒有確保物件非空而引起的 NullPointerException ,
(3)錯誤
定義 :
Error類及其子類,
特點 :
和運行時例外一樣,編譯器也不會對錯誤進行檢查,當資源不足、約束失敗、或是其它程式無法繼續運行的條件發生時,就產生錯誤,程式本身無法修復這些錯誤的,例如,VirtualMachineError就屬于錯誤,出現這種錯誤會導致程式終止運行,OutOfMemoryError、ThreadDeath,Java虛擬機規范規定JVM的記憶體分為了好幾塊,比如堆,堆疊,程式計數器,方法區等
需要的朋友可以點擊:點這個!點這個!暗號:csdn

6、Thow與thorws區別
位置不同
1.throws 用在函式上,后面跟的是例外類,可以跟多個;而 throw 用在函式內,后面跟的是例外物件,
功能不同:
2.throws 用來宣告例外,讓呼叫者只知道該功能可能出現的問題,可以給出預先的處理方式;throw 拋出具體的問題物件,執行到 throw,功能就已經結束了,跳轉到呼叫者,并將具體的問題物件拋給呼叫者,也就是說 throw 陳述句獨立存在時,下面不要定義其他陳述句,因為執行不到,
3. throws 表示出現例外的一種可能性,并不一定會發生這些例外;throw 則是拋出了例外,執行 throw 則一定拋出了某種例外物件,
4. 兩者都是消極處理例外的方式,只是拋出或者可能拋出例外,但是不會由函式去處理例外,真正的處理例外由函式的上層呼叫處理,
7、Error與Exception區別?
Error和Exception都是java錯誤處理機制的一部分,都繼承了Throwable類,Exception表示的例外,例外可以通程序式來捕捉,或者優化程式來避免,Error表示的是系統錯誤,不能通程序式來進行錯誤處理,
8、error和exception有什么區別
error 表示恢復不是不可能但很困難的情況下的一種嚴重問題,比如說記憶體溢位,不可能指望程式能處理這樣的情況 exception 表示一種設計或實作問題,也就是說,它表示如果程式運行正常,從不會發生的情況,
IO與NIO面試篇
1、Java 中 IO 流?
Java 中 IO 流分為幾種?
1.按照流的流向分,可以分為輸入流和輸出流;
2. 按照操作單元劃分,可以劃分為位元組流和字符流;
3. 按照流的角色劃分為節點流和處理流,
Java Io 流共涉及 40 多個類,這些類看上去很雜亂,但實際上很有規則,而且彼此之間存在非常緊密的聯系, Java I0 流的 40 多個類都是從如下 4 個抽象類基類中派生出來的,
1.InputStream/Reader: 所有的輸入流的基類,前者是位元組輸入流,后者是字符輸入流,
2.OutputStream/Writer: 所有輸出流的基類,前者是位元組輸出流,后者是字符輸出流,
2、 Java IO與 NIO的區別
NIO即New IO,這個庫是在JDK1.4中才引入的,NIO和IO有相同的作用和目的,但實作方式不同,NIO 主要用到的是塊,所以NIO的效率要比IO高很多,在Java API中提供了兩套NIO,一套是針對標準輸入輸出NIO,另一套就是網路編程NIO,
3、常用io類有那些

4、位元組流與字符流的區別
以位元組為單位輸入輸出資料,位元組流按照8位傳輸
以字符為單位輸入輸出資料,字符流按照16位傳輸
5、阻塞 IO 模型
最傳統的一種 IO 模型,即在讀寫資料程序中會發生阻塞現象,當用戶執行緒發出 IO 請求之后,內核會去查看資料是否就緒,如果沒有就緒就會等待資料就緒,而用戶執行緒就會處于阻塞狀態,用戶執行緒交出 CPU,當資料就緒之后,內核會將資料拷貝到用戶執行緒,并回傳結果給用戶執行緒,用 戶執行緒才解除 block 狀態,典型的阻塞 IO 模型的例子為: data = socket.read();如果資料沒有就緒,就會一直阻塞在 read 方法
6、非阻塞 IO 模型
當用戶執行緒發起一個 read 操作后,并不需要等待,而是馬上就得到了一個結果, 如果結果是一個error 時,它就知道資料還沒有準備好,于是它可以再次發送 read 操作,一旦內核中的資料準備好了,并且又再次收到了用戶執行緒的請求,那么它馬上就將資料拷貝到了用戶執行緒,然后回傳,所以事實上,在非阻塞 IO 模型中,用戶執行緒需要不斷地詢問內核資料是否就緒,也就說非阻塞 IO不會交出 CPU,而會一直占用 CPU, 典型的非阻塞 IO 模型一般如下:

但是對于非阻塞 IO 就有一個非常嚴重的問題, 在 while 回圈中需要不斷地去詢問內核資料是否就緒,這樣會導致 CPU 占用率非常高,因此一般情況下很少使用 while 回圈這種方式來讀取資料,
7、多路復用 IO 模型
多路復用 IO 模型是目前使用得比較多的模型, Java NIO 實際上就是多路復用 IO,在多路復用 IO模型中,會有一個執行緒不斷去輪詢多個socket 的狀態,只有當 socket 真正有讀寫事件時,才真正呼叫實際的 IO 讀寫操作,因為在多路復用 IO 模型中,只需要使用一個執行緒就可以管理多個socket,系統不需要建立新的行程或者執行緒,也不必維護這些執行緒和行程,并且只有在真正有socket 讀寫事件進行時,才會使用IO 資源,所以它大大減少了資源占用,在 Java NIO 中,是通過 selector.select()去查詢每個通道是否有到達事件,如果沒有事件,則一直阻塞在那里,因此這種方式會導致用戶執行緒的阻塞,多路復用 IO 模式,通過一個執行緒就可以管理多個 socket,只有當socket 真正有讀寫事件發生才會占用資源來進行實際的讀寫操作,因此,多路復用 IO 比較適合連接數比較多的情況,
另外多路復用 IO 為何比非阻塞 IO 模型的效率高是因為在非阻塞 IO 中,不斷地詢問 socket 狀態時通過用戶執行緒去進行的,而在多路復用IO 中,輪詢每個 socket 狀態是內核在進行的,這個效率要比用戶執行緒要高的多,
不過要注意的是,多路復用 IO 模型是通過輪詢的方式來檢測是否有事件到達,并且對到達的事件逐一進行回應,因此對于多路復用 IO 模型來說, 一旦事件回應體很大,那么就會導致后續的事件遲遲得不到處理,并且會影響新的事件輪詢,
8、信號驅動 IO 模型在
信號驅動 IO 模型中,當用戶執行緒發起一個 IO 請求操作,會給對應的 socket 注冊一個信號函式,然后用戶執行緒會繼續執行,當內核資料就緒時會發送一個信號給用戶執行緒,用戶執行緒接收到信號之后,便在信號函式中呼叫 IO 讀寫操作來進行實際的 IO 請求操作,
9、異步 IO 模型
異步 IO 模型才是最理想的 IO 模型,在異步 IO 模型中,當用戶執行緒發起 read 操作之后,立刻就可以開始去做其它的事,而另一方面,從內核的角度,當它受到一個 asynchronous read 之后,它會立刻回傳,說明 read 請求已經成功發起了,因此不會對用戶執行緒產生任何block,然后,內核會等待資料準備完成,然后將資料拷貝到用戶執行緒,當這一切都完成之后,內核會給用戶執行緒發送一個信號,告訴它read 操作完成了,也就說用戶執行緒完全不需要實際的整個 IO 操作是如何進行的, 只需要先發起一個請求,當接收內核回傳的成功信號時表示 IO 操作已經完成,可以直接去使用資料了,
也就說在異步 IO 模型中, IO 操作的兩個階段都不會阻塞用戶執行緒,這兩個階段都是由內核自動完成,然后發送一個信號告知用戶執行緒操作已完成,用戶執行緒中不需要再次呼叫 IO 函式進行具體的讀寫,這點是和信號驅動模型有所不同的,在信號驅動模型中,當用戶執行緒接收到信號表示資料已經就緒,然后需要用戶執行緒呼叫 IO 函式進行實際的讀寫操作;而在異步 IO 模型中,收到信號表示 IO 操作已經完成,不需要再在用戶執行緒中呼叫 IO 函式進行實際的讀寫操作,
注意,異步 IO 是需要作業系統的底層支持,在 Java 7 中,提供了 Asynchronous IO,
10、JAVA NIO
NIO 主要有三大核心部分: Channel(通道), Buffer(緩沖區), Selector,
傳統 IO 基于位元組流和字符流進行操作, 而 NIO 基于 Channel 和Buffer(緩沖區)進行操作,資料總是從通道讀取到緩沖區中,或者從緩沖區寫入到通道中, Selector(選擇區)用于監聽多個通道的事件(比如:連接打開,資料到達),因此,單個執行緒可以監聽多個資料通道, NIO 和傳統 IO 之間第一個最大的區別是, IO 是面向流的, NIO 是面向緩沖區的,
11、NIO 的緩沖區
Java IO 面向流意味著每次從流中讀一個或多個位元組,直至讀取所有位元組,它們沒有被快取在任何地方,此外,它不能前后移動流中的資料,如果需要前后移動從流中讀取的資料, 需要先將它快取到一個緩沖區, NIO 的緩沖導向方法不同,
資料讀取到一個它稍后處理的緩沖區,需要時可在緩沖區中前后移動,這就增加了處理程序中的靈活性,但是,還需要檢查是否該緩沖區中包含所有您需要處理的資料,而且,需確保當更多的資料讀入緩沖區時,不要覆寫緩沖區里尚未處理的資料,
12、NIO 的非阻塞
IO 的各種流是阻塞的,這意味著,當一個執行緒呼叫 read() 或 write()時,該執行緒被阻塞,直到有一些資料被讀取,或資料完全寫入,該執行緒在此期間不能再干任何事情了, NIO 的非阻塞模式,使一個執行緒從某通道發送請求讀取資料,但是它僅能得到目前可用的資料,如果目前沒有資料可用時,就什么都不會獲取,而不是保持執行緒阻塞,所以直至資料變的可以讀取之前,該執行緒可以繼續做其他的事情, 非阻塞寫也是如此,一個執行緒請求寫入一些資料到某通道,但不需要等待它完全寫入,這個執行緒同時可以去做別的事情, 執行緒通常將非阻塞 IO 的空閑時間用于在其它通道上執行 IO 操作,所以一個單獨的執行緒現在可以管理多個輸入和輸出通道(channel),
13、Channel
首先說一下 Channel,國內大多翻譯成“通道”, Channel 和 IO 中的 Stream(流)是差不多一個等級的, 只不過 Stream 是單向的,譬如:InputStream, OutputStream, 而 Channel 是雙向的,既可以用來進行讀操作,又可以用來進行寫操作,NIO 中的 Channel 的主要實作有:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
這里看名字就可以猜出個所以然來:分別可以對應檔案 IO、 UDP 和 TCP(Server 和 Client),下面演示的案例基本上就是圍繞這 4 個型別的 Channel 進行陳述的,
14、Buffer
Buffer,故名思意, 緩沖區,實際上是一個容器,是一個連續陣列, Channel 提供從檔案、網路讀取資料的渠道,但是讀取或寫入的資料都必須經由 Buffer,

上面的圖描述了從一個客戶端向服務端發送資料,然后服務端接收資料的程序,客戶端發送資料時,必須先將資料存入 Buffer 中,然后將Buffer 中的內容寫入通道,服務端這邊接收資料必須通過 Channel 將資料讀入到 Buffer 中,然后再從 Buffer 中取出資料來處理,
在 NIO 中, Buffer 是一個頂層父類,它是一個抽象類,常用的 Buffer 的子類有:ByteBuffer、 IntBuffer、 CharBuffer、 LongBuffer、DoubleBuffer、 FloatBuffer、ShortBuffer
15、SelectorSelector
類是 NIO 的核心類, Selector 能夠檢測多個注冊的通道上是否有事件發生,如果有事件發生,便獲取事件然后針對每個事件進行相應的回應處理,這樣一來,只是用一個單執行緒就可以管理多個通道,也就是管理多個連接,這樣使得只有在連接真正有讀寫事件發生時,才會呼叫函式來進行讀寫,就大大地減少了系統開銷,并且不必為每個連接都創建一個執行緒,不用去維護多個執行緒,并且避免了多執行緒之間的背景關系切換導致的開銷,
同時提供【免費】的Java架構學習資料,學習技術內容包含有:Spring,Dubbo,MyBatis, RPC, 原始碼分析,高并發、高性能、分布式,性能優化,微服務 高級架構開發等等,
點擊:點這個!點這個!暗號:csdn,即可全部獲得,
還有Java核心知識點+全套架構師學習資料和視頻+一線大廠面試寶典+面試簡歷模板可以領取+阿里美團網易騰訊小米愛奇藝快手嗶哩嗶哩面試題+Spring原始碼合集+Java架構實戰電子書,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/16857.html
標籤:其他
上一篇:思科 OSPF協議簡單配置與分析
