1. 程式人生 > >【8】進大廠必須掌握的面試題-Java面試-異常和執行緒

【8】進大廠必須掌握的面試題-Java面試-異常和執行緒

### **Q1。錯誤和異常有什麼區別?** 錯誤是在執行時發生的不可恢復的情況。如OutOfMemory錯誤。這些JVM錯誤無法在執行時修復。儘管可以在catch塊中捕獲錯誤,但是應用程式的執行將停止並且無法恢復。 而異常是由於輸入錯誤或人為錯誤等原因而發生的情況。例如,如果指定的檔案不存在,則將丟擲FileNotFoundException。否則,如果嘗試使用null引用,則會發生NullPointerException。在大多數情況下,有可能從異常中恢復(可能是通過向用戶提供輸入正確值的反饋等)。 ### **Q2。您如何處理Java異常?** Java中有五個關鍵字用於處理異常: 1. try 2. catch 3. finally 4. throw 5. throws ### **Q3。Checked Exception和Unchecked Exception有什麼區別?** #### **檢查異常** - 擴充套件Throwable類的類(RuntimeException和Error除外)被稱為檢查異常。 - 被檢查的異常在編譯時被檢查。 - 示例:IOException,SQLException等。 #### **未經檢查的異常** - 擴充套件RuntimeException的類稱為未檢查的異常。 - 未檢查的異常不會在編譯時檢查。 - 例如:ArithmeticException,NullPointerException等。 ### **Q4。關鍵字final,finally和finalize有什麼目的?** #### final:** Final用於對類,方法和變數施加限制。不能繼承final類,不能覆蓋final方法,並且不能更改final變數值。讓我們看下面的示例,以更好地理解它。 ```java class FinalVarExample { public static void main( String args[]){ final int a=10; // Final variable a=50; //Error as value can't be changed } } ``` #### finally 最後用於放置重要程式碼,無論是否處理異常,都將執行該程式碼。讓我們看下面的示例,以更好地理解它。 ```java class FinallyExample { public static void main(String args[]){ try { int x=100; }catch(Exception e) { System.out.println(e); }finally { System.out.println("finally block is executing"); } } } ``` #### finalize Finalize用於在垃圾回收之前就執行清理處理。讓我們看下面的示例,以更好地理解它。 ```java class FinalizeExample { public void finalize() { System.out.println("Finalize is called"); } public static void main(String args[]){ FinalizeExample f1=new FinalizeExample(); FinalizeExample f2=new FinalizeExample(); f1= NULL; f2=NULL; System.gc(); } } ``` ### **Q5。throw和throws有什麼區別?** | throw | throws | | --------------------------------- | ------------------------------------------------------------ | | 引發用於顯式引發異常。 | 引發用於宣告異常。 | | 已檢查的異常不能僅通過throw傳播。 | 可以使用throws傳播檢查的異常。 | | 引發後跟一個例項。 | 投擲之後是上課。 | | 在方法中使用了throw。 | 丟擲與方法簽名一起使用。 | | 您不能丟擲多個異常 | 您可以宣告多個異常,例如public void method()引發IOException,SQLException。 | ### **Q6。什麼是Java中的異常層次結構?** 層次結構如下: Throwable是所有Exception類的父類。異常有兩種型別:檢查的異常和UncheckedExceptions或RunTimeExceptions。兩種型別的異常都擴充套件了Exception類,而錯誤又進一步分為虛擬機器錯誤和斷言錯誤。 ### **Q7。如何建立自定義異常?** 要建立您自己的異常,請擴充套件Exception類或其任何子類。 - class New1Exception extends Exception {} //這將建立Checked Exception - 類NewException擴充套件了IOException {} //這將建立Checked異常 - 類NewException擴充套件了NullPonterExcpetion {} //這將建立UnChecked異常 ### **Q8。Java異常類的重要方法有哪些?** 異常及其所有子類均未提供任何特定方法,並且所有方法均在基類Throwable中定義。 1. **String getMessage()** –此方法返回Throwable訊息字串,並且可以在通過其建構函式建立異常時提供該訊息。 2. **String getLocalizedMessage(**)–提供此方法,以便子類可以重寫它以向呼叫程式提供特定於語言環境的訊息。此方法的可丟擲類實現僅使用getMessage()方法即可返回異常訊息。 3. **Synchronized Throwable getCause()** –此方法返回異常原因,或者返回null id,原因未知。 4. **String toString()** –此方法以String格式返回有關Throwable的資訊,返回的String包含Throwable類的名稱和本地化訊息。 5. **void printStackTrace()** –此方法將堆疊跟蹤資訊列印到標準錯誤流,此方法已過載,我們可以傳遞PrintStream或PrintWriter作為引數,以將堆疊跟蹤資訊寫入檔案或流。 ### **Q9。程序和執行緒之間有什麼區別?** | | Process | **Thread** | | ------------ | ------------------------------------------ | -------------------------------------------------- | | **定義** | 程式的執行例項稱為程序。 | 執行緒是程序的子集。 | | **通訊** | 程序必須使用程序間通訊與同級程序進行通訊。 | 執行緒可以直接與其程序中的其他執行緒通訊。 | | **控制** | 程序只能控制子程序。 | 執行緒可以對同一程序的執行緒行使相當大的控制權。 | | **變化** | 父程序中的任何更改都不會影響子程序。 | 主執行緒中的任何更改都可能影響該程序其他執行緒的行為。 | | **記憶** | 在單獨的記憶體空間中執行。 | 在共享記憶體空間中執行。 | | **受控制於** | 程序由作業系統控制。 | 執行緒由程式中的程式設計師控制。 | | **依存關係** | 流程是獨立的。 | 執行緒是依賴的。 | ### **Q10。什麼是finally塊?有沒有什麼情況下最終將不會執行?** 最終塊是始終執行一組語句的塊。它始終與try塊相關聯,無論是否發生任何異常。 是的,如果程式通過呼叫System.exit()或導致致命錯誤(導致程序中止)退出,則最終將不會執行。 ### **Q11。什麼是同步?** 同步是指多執行緒。同步的程式碼塊一次只能由一個執行緒執行。由於Java支援執行多個執行緒,因此兩個或多個執行緒可以訪問相同的欄位或物件。同步是使所有併發執行緒在執行中保持同步的過程。同步避免了由於共享記憶體檢視不一致而導致的記憶體一致性錯誤。當一個方法被宣告為已同步時,執行緒將保持該方法物件的監視器。如果另一個執行緒正在執行同步方法,則該執行緒將被阻塞,直到該執行緒釋放監視器。 ![同步-Java面試問題-Edureka](https://img2020.cnblogs.com/other/2169955/202010/2169955-20201016170447938-471510994.png) ### ### **Q12。我們可以在單個try塊下寫入多個catch塊嗎?** 是的,我們可以在單個try塊下包含多個catch塊,但是方法應從特定到一般。讓我們通過一個程式設計示例來理解這一點。 ```java public class Example { public static void main(String args[]) { try { int a[] = new int[10]; a[10] = 10 / 0; } catch (ArithmeticException e) { System.out.println("Arithmetic exception in first catch block"); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Array index out of bounds in second catch block"); } catch (Exception e) { System.out.println("Any exception in third catch block"); } } } ``` ### **Q13。Java異常類的重要方法有哪些?** 方法在基類Throwable中定義。Java異常類的一些重要方法如下所述。 1. **String getMessage()** –此方法返回有關異常的訊息String。可以通過其建構函式提供訊息。 2. **public StackTraceElement [] getStackTrace()–**此方法返回一個數組,其中包含堆疊跟蹤中的每個元素。索引0處的元素表示呼叫堆疊的頂部,而陣列中的最後一個元素表示呼叫堆疊底部的方法。 3. **同步的Throwable getCause()** –此方法返回Throwable物件表示的異常原因或null ID。 4. **String toString()** –此方法以String格式返回資訊。返回的字串包含Throwable類的名稱和本地化訊息。 5. **void printStackTrace()** –此方法將堆疊跟蹤資訊列印到標準錯誤流。 ### **Q14。什麼是Java中的OutOfMemoryError?** OutOfMemoryError是java.lang.Error的子類,通常在我們的JVM記憶體不足時發生。 ### **Q15。什麼是執行緒?** 執行緒是可以由排程程式獨立執行的最小程式設計指令。在Java中,所有程式都將至少具有一個執行緒,該執行緒稱為主執行緒。當程式開始執行時,此主執行緒由JVM建立。主執行緒用於呼叫程式的main()。 ### **Q16。建立執行緒的兩種方法是什麼?** 在Java中,可以通過以下兩種方式建立執行緒: - 通過實現Runnable介面。 - 通過擴充套件執行緒 ### **Q17。Java中有哪些不同型別的垃圾收集器?** Java中的垃圾收集程式,可以幫助進行隱式記憶體管理。由於在Java中,可以使用new關鍵字動態建立物件,一旦建立物件,該物件將消耗一些記憶體。一旦工作完成,並且不再有物件的引用,使用垃圾回收的Java將破壞該物件並釋放其佔用的記憶體。Java提供了四種類型的垃圾收集器: - 序列垃圾收集器 - 並行垃圾收集器 - CMS垃圾收集器 - G1垃圾收集器 > 歡迎關注 [Java架構師社群](http://javajgs.com/)公眾號. > 本文轉載自[Java架構師必看](http://javajgs.com/archives/6617) ,更多內容點選