Java面試題之Java基礎部分 41-50題

40final, finally, finalize的區別。

1final 用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。

內部類要訪問局部變量,局部變量必須定義成final類型,例如,一段代碼……

2finally是異常處理語句結構的一部分,表示總是執行。

3finalizeObject類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等。JVM不保證此方法總被調用

 

41、運行時異常與一般異常有何異同?

    Java 提供了兩類主要的異常 : runtime exception 和 checked exception 。 checked 異常也就是我們經常遇到的 IO 異常,以及 SQL 異常都是這種異常。 對於這種異常, JAVA 編譯器強制要求我們必需對出現的這些異常進行 catch 所以,面對這種異常不管我們是否願意,只能自己去寫一大堆 catch 塊去處理可能的異常。

    但是另外一種異常: runtime exception ,也稱運行時異常,我們可以不處理。當出現這樣的異常時,總是由虛擬機 接管。比如:我們從來沒有人去處理過 NullPointerException 異常,它就是運行時異常,並且這種異常還是最常見的異常之一。

    出現運行時異常後,系統會把異常一直往上層拋,一直遇到處理代碼。如果沒有處理塊,到最上層,如果是多線程就由 Thread.run() 拋出 ,如果是單線程就被 main() 拋出 。拋出之後,如果是線程,這個線程也就退出了。如果是主程序拋出的異常,那麼這整個程序也就退出了。運行時異常是 Exception 的子類,也有一般異常的特點,是可以被 Catch 塊處理的。只不過往往我們不對他處理罷了。也就是說,你如果不對運行時異常進行處理,那麼出現運行時異常之後,要麼是線程中止,要麼是主程序終止。

    如果不想終止,則必須撲捉所有的運行時異常,決不讓這個處理線程退出。隊列裏面出現異常數據了,正常的處理應該是把異常數據捨棄,然後記錄日誌。不應該由於異常數據而影響下面對正常數據的處理。 在這個場景這樣處理可能是一個比較好的應用,但並不代表在所有的場景你都應該如此。如果在其它場景,遇到了一些錯誤,如果退出程序比較好,這時你就可以不太理會運行時異常 ,或者是通過對異常的處理顯式的控制程序退出。

異常處理的目標之一就是爲了把程序從異常中恢復出來。

 

42errorexception有什麼區別?

   Throwable 是所有 Java 程序中錯誤處理的父類 ,有兩種資類: Error 和 Exception 

   Error :表示由 JVM 所偵測到的無法預期的錯誤,由於這是屬於 JVM 層次的嚴重錯誤 ,導致 JVM 無法繼續執行,因此,這是不可捕捉到的,無法採取任何恢復的操作,頂多只能顯示錯誤信息。比如說內存溢出

   Exception :表示一種設計或實現問題,是可恢復的例外,是可捕捉到的。

 

43Java中的異常處理機制的簡單原理和應用。

    異常是指java程序運行時(非編譯)所發生的非正常情況或錯誤,與現實生活中的事件很相似,現實生活中的事件可以包含事件發生的時間、地點、人物、情節等信息,可以用一個對象來表示,Java使用面向對象的方式來處理異常,它把程序中發生的每個異常也都分別封裝到一個對象來表示的,該對象中包含有異常的信息。

Java對異常進行了分類,不同類型的異常分別用不同的Java類表示,所有異常的根類爲java.lang.ThrowableThrowable下面又派生了兩個子類:ErrorExceptionError表示應用程序本身無法克服和恢復的一種嚴重問題,程序只有死的份了,例如,說內存溢出和線程死鎖等系統問題。Exception表示程序還能夠克服和恢復的問題,其中又分爲系統異常和普通異常,系統異常是軟件本身缺陷所導致的問題,也就是軟件開發人員考慮不周所導致的

問題,軟件使用者無法克服和恢復這種問題,但在這種問題下還可以讓軟件系統繼續運行或者讓軟件死掉,例如,數組腳本越界(ArrayIndexOutOfBoundsException),空指針異常(NullPointerException)、類轉換異常(ClassCastException);普通異常是運行環境的變化或異常所導致的問題,是用戶能夠克服的問題,例如,網絡斷線,硬盤空間不夠,發生這樣的異常後,程序不應該死掉。

java爲系統異常和普通異常提供了不同的解決方案,編譯器強制普通異常必須try..catch處理或用throws聲明繼續拋給上層調用方法處理,所以普通異常也稱爲checked異常,而系統異常可以處理也可以不處理,所以,編譯器不強制用try..catch處理或用throws聲明,所以系統異常也稱爲unchecked異常。

 

44、請寫出你最常見到的5runtime exception

數組腳本越界(ArrayIndexOutOfBoundsException),空指針異常(NullPointerException)、類轉換異常(ClassCastException);除數爲0的異常(ArithmeticException)IllegalArgumentException(不合法的參數異常)

   這道題主要考你的代碼量到底多大,如果你長期寫代碼的,應該經常都看到過一些系統方面的異常,你不一定真要回答出5個具體的系統異常,但你要能夠說出什麼是系統異常,以及幾個系統異常就可以了,當然,這些異常完全用其英文名稱來寫是最好的,如果實在寫不出,那就用中文吧,有總比沒有強!

所謂系統異常,就是…..,它們都是RuntimeException的子類,在jdk doc中查RuntimeException類,就可以看到其所有的子類列表,也就是看到了所有的系統異常。我比較有印象的系統異常有:NullPointerExceptionArrayIndexOutOfBoundsExceptionClassCastException

1Object x = new Integer(0);

   System.out.println((String)x);

當試圖將對象強制轉換爲不是實例的子類時,拋出該異常(ClassCastException)

2int a=5/0;

   一個整數“除以零”時,拋出ArithmeticException異常。

3, String s=null;

  int size=s.size();

  當應用程序試圖在需要對象的地方使用 null 時,拋出NullPointerException異常

4, "hello".indexOf(-1);

  指示索引或者爲負,或者超出字符串的大小,拋出StringIndexOutOfBoundsException異常

5String[] ss=new String[-1];

如果應用程序試圖創建大小爲負的數組,則拋出NegativeArraySizeException異常。

 

45JAVA語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別代表什麼意義?在try塊中可以拋出異常嗎?

    throws捕獲並向外拋出異常

    throw拋出異常

    try catch是內部捕獲異常並做自定義處理

    finally是無論是否有異常都會被處理的語句,除非在finally前存在被執行的System.exit(int i)時除外

 

46、java中有幾種方法可以實現一個線程?用什麼關鍵字修飾同步方法? stop()suspend()方法爲何不推薦使用?

    有兩種實現方法,分別是繼承Thread類與實現Runnable接口

    用synchronized關鍵字修飾同步方法

反對使用stop(),是因爲它不安全。它會解除由線程獲取的所有鎖定,而且如果對象處於一種不連貫狀態,那麼其他線程能在那種狀態下檢查和修改它們。結果很難檢查出真正的問題所在。suspend()方法容易發生死鎖。調用suspend()的時候,目標線程會停下來,但卻仍然持有在這之前獲得的鎖定。此時,其他任何線程都不能訪問鎖定的資源,除非被"掛起"的線程恢復運行。對任何線程來說,如果它們想恢復目標線程,同時又試圖使用任何一個鎖定的資源,就會造成死鎖。所以不應該使用suspend(),而應在自己的Thread類中置入一個標誌,指出線程應該活動還是掛起。若標誌指出線程應該掛起,便用wait()命其進入等待狀態。若標誌指出線程應當恢復,則用一個notify()重新啓動線程。

兩種方式比較(面試)  

1A extends Thread

  簡單

   不能再繼承其他類了(Java單繼承),同份資源不共享

2A implements Runnable:(推薦)

  該類還可以繼承其他類,也可以實現其他接口。

  多個線程共享一個目標資源,適合多線程處理同一份資源。

 

47sleep()和 wait()有什麼區別?

1)這兩個方法來自不同的類分別是ThreadObject

2)最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。

3)使用範圍:waitnotifynotifyAll只能在同步控制方法或者同步控制塊裏面使用,而sleep可以在任何地方使用。Wait方法要等待喚醒後,線程纔會繼續執行;sleep則是休眠一段時間後,線程自動恢復。

4sleep必須捕獲異常,而waitnotifynotifyAll不需要捕獲異常

 

(網上的答案:sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,給執行機會給其他線程,但是監控狀態依然保持,到時後會自動恢復。調用sleep不會釋放對象鎖。 waitObject類的方法,對此對象調用wait方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)後本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態。

 

48、同步和異步有何異同,在什麼情況下分別使用他們?舉例說明。

同步:上一段代碼沒的完成,下一段必須等到上一段代碼完成後纔可以執行。如買票排隊。異步:上一段代碼沒的完成,下一段不必等到上一段代碼完成就可以執行。如手機發送短信

    同步可以避免出現死鎖,一般共享某一資源的時候用,如果每個人都有修改權限,同時修改一個文件,有可能使一個人讀取另一個人已經刪除的內容,就會出錯,同步就會按順序來修改。

    異步則是可以提高效率了,現在cpu都是雙核,四核,異步處理的話可以同時做多項工作,當然必須保證是可以併發處理的。

同步和異步最大的區別就在於。一個需要等待,一個不需要等待。比如廣播,就是一個異步例子。發起者不關心接收者的狀態。不需要等待接收者的返回信息電話,就是一個同步例子。發起者需要等待接收者,接通電話後,通信纔開始。需要等待接收者的返回信息。

 

49. 下面兩個方法同步嗎?

class Test{

   synchronized static void sayHello3(){} 

   synchronized void getX(){}

}

   sayHello3是一個靜態函數,所以可以直接由類名調用,所以這裏用到的鎖是Test的字節碼文件,即Test.class;而get函數不是靜態函數,需要由這個類的實例進行調用,所以用到的鎖是this,所以這兩個方法不是同步的(當然對於單獨的函數,那是同步的。)

 

 

50、多線程有幾種實現方法?同步有幾種實現方法?

多線程有兩種實現方法,分別是繼承Thread類與實現Runnable接口

線程同步

    1. 用 synchronized 修飾需要同步的方法 

    2. 用 synchronized 塊包圍需要同步的語句 

3. 使用 java.util.concurrent 包中的各種同步鎖 

發佈了116 篇原創文章 · 獲贊 34 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章