Q1。錯誤和異常有什么區別?
錯誤是在運行時發生的不可恢復的情況。如OutOfMemory錯誤。這些JVM錯誤無法在運行時修復。盡管可以在catch塊中捕獲錯誤,但是應用程序的執行將停止並且無法恢復。
而異常是由於輸入錯誤或人為錯誤等原因而發生的情況。例如,如果指定的文件不存在,則將拋出FileNotFoundException。否則,如果嘗試使用null引用,則會發生NullPointerException。在大多數情況下,有可能從異常中恢復(可能是通過向用戶提供輸入正確值的反饋等)。
Q2。您如何處理Java異常?
Java中有五個關鍵字用於處理異常:
- try
- catch
- finally
- throw
- throws
Q3。Checked Exception和Unchecked Exception有什么區別?
檢查異常
- 擴展Throwable類的類(RuntimeException和Error除外)被稱為檢查異常。
- 被檢查的異常在編譯時被檢查。
- 示例:IOException,SQLException等。
未經檢查的異常
- 擴展RuntimeException的類稱為未檢查的異常。
- 未檢查的異常不會在編譯時檢查。
- 例如:ArithmeticException,NullPointerException等。
Q4。關鍵字final,finally和finalize有什么目的?
final:**
Final用於對類,方法和變量施加限制。不能繼承final類,不能覆蓋final方法,並且不能更改final變量值。讓我們看下面的示例,以更好地理解它。
class FinalVarExample {
public static void main( String args[]){
final int a=10; // Final variable
a=50; //Error as value can't be changed
}
}
finally
最后用於放置重要代碼,無論是否處理異常,都將執行該代碼。讓我們看下面的示例,以更好地理解它。
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用於在垃圾回收之前就執行清理處理。讓我們看下面的示例,以更好地理解它。
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中定義。
- String getMessage() –此方法返回Throwable消息字符串,並且可以在通過其構造函數創建異常時提供該消息。
- String getLocalizedMessage()–提供此方法,以便子類可以重寫它以向調用程序提供特定於語言環境的消息。此方法的可拋出類實現僅使用getMessage()方法即可返回異常消息。
- Synchronized Throwable getCause() –此方法返回異常原因,或者返回null id,原因未知。
- String toString() –此方法以String格式返回有關Throwable的信息,返回的String包含Throwable類的名稱和本地化消息。
- void printStackTrace() –此方法將堆棧跟蹤信息打印到標准錯誤流,此方法已重載,我們可以傳遞PrintStream或PrintWriter作為參數,以將堆棧跟蹤信息寫入文件或流。
Q9。進程和線程之間有什么區別?
Process | Thread | |
---|---|---|
定義 | 程序的執行實例稱為進程。 | 線程是進程的子集。 |
通訊 | 進程必須使用進程間通信與同級進程進行通信。 | 線程可以直接與其進程中的其他線程通信。 |
控制 | 進程只能控制子進程。 | 線程可以對同一進程的線程行使相當大的控制權。 |
變化 | 父進程中的任何更改都不會影響子進程。 | 主線程中的任何更改都可能影響該進程其他線程的行為。 |
記憶 | 在單獨的內存空間中運行。 | 在共享內存空間中運行。 |
受控制於 | 進程由操作系統控制。 | 線程由程序中的程序員控制。 |
依存關系 | 流程是獨立的。 | 線程是依賴的。 |
Q10。什么是finally塊?有沒有什么情況下最終將不會執行?
最終塊是始終執行一組語句的塊。它始終與try塊相關聯,無論是否發生任何異常。
是的,如果程序通過調用System.exit()或導致致命錯誤(導致進程中止)退出,則最終將不會執行。
Q11。什么是同步?
同步是指多線程。同步的代碼塊一次只能由一個線程執行。由於Java支持執行多個線程,因此兩個或多個線程可以訪問相同的字段或對象。同步是使所有並發線程在執行中保持同步的過程。同步避免了由於共享內存視圖不一致而導致的內存一致性錯誤。當一個方法被聲明為已同步時,線程將保持該方法對象的監視器。如果另一個線程正在執行同步方法,則該線程將被阻塞,直到該線程釋放監視器。
Q12。我們可以在單個try塊下寫入多個catch塊嗎?
是的,我們可以在單個try塊下包含多個catch塊,但是方法應從特定到一般。讓我們通過一個編程示例來理解這一點。
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異常類的一些重要方法如下所述。
- String getMessage() –此方法返回有關異常的消息String。可以通過其構造函數提供消息。
- public StackTraceElement [] getStackTrace()–此方法返回一個數組,其中包含堆棧跟蹤中的每個元素。索引0處的元素表示調用堆棧的頂部,而數組中的最后一個元素表示調用堆棧底部的方法。
- 同步的Throwable getCause() –此方法返回Throwable對象表示的異常原因或null ID。
- String toString() –此方法以String格式返回信息。返回的字符串包含Throwable類的名稱和本地化消息。
- 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垃圾收集器