Java的异常處理|Java基礎

掩埋 2021-08-15 13:37:03 阅读数:557

本文一共[544]字,预计阅读时长:1分钟~
java 异常 java

這是我參與8月更文挑戰的第14天,活動詳情查看:8月更文挑戰

Java中异常分類

今天介紹Java中的异常,都是概念性的東西,代碼涉及較少。

按照异常需要處理的時機分為編譯時异常(也叫强制性异常)也叫CheckedException和運行時异常(也叫非强制性异常)也叫RuntimeException。只有java語言提供了Checked异常,Java認為Checked异常都是可以被處理的异常,所以Java程序必須顯式處理Checked异常。如果程序沒有處理Checked异常,該程序在編譯時就會發生錯誤無法編譯。這體現了Java的設計哲學:沒有完善錯誤處理的代碼根本沒有機會被執行。對Checked异常處理方法有兩種:

  • 當前方法知道如何處理該异常,則用try...catch塊來處理該异常。

  • 當前方法不知道如何處理,則在定義該方法是聲明拋出該异常。

try...catch

public class BufferedStreamLearn {
public static void main(String[] args) {
//創建字符緩沖輸入流
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader("File\ShixfBW.txt"));
String line;
while ((line=br.readLine())!=null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
複制代碼

方法拋出

public class BufferedStreamLearn {
public static void main(String[] args) throws IOException {
//創建字符緩沖輸入流
BufferedReader br = new BufferedReader(new FileReader("File\ShixfBW.txt"));
String line;
while ((line=br.readLine())!=null) {
System.out.println(line);
}
br.close();
}
}
複制代碼

運行時异常只有當代碼在運行時才發行的异常,編譯時不需要try catch。Runtime如除數是0和數組下標越界等,其產生頻繁,處理麻煩,若顯示申明或者捕獲將會對程序的可讀性和運行效率影響很大。所以由系統自動檢測並將它們交給缺省的异常處理程序。當然如果你有處理要求也可以顯示捕獲它們。

finally介紹

public class Client {
public static void main(String[] args) {
try {
int i = 1 / 0;
} catch (Exception e){
System.out.println("0不能做除數");
e.printStackTrace();
} finally {
System.out.println("finally 塊執行");
}
}
}
複制代碼

image.png finally無論是否拋出异常finally總是執行,一般用於釋放資源的操作

error和exception的區別

Error類和Exception類的父類都是Throwable類,他們的區別如下。

  • Error類一般是指與虛擬機相關的問題,如系統崩潰,虛擬機錯誤,內存空間不足,方法調用棧溢出等。對於這類錯誤的導致的應用程序中斷,僅靠程序本身無法恢複和和預防,遇到這樣的錯誤,建議讓程序終止。

  • Exception類錶示程序可以處理的异常,可以捕獲且可能恢複。遇到這類异常,應該盡可能處理异常,使程序恢複運行,而不應該隨意終止异常。

  • Exception類又分為運行時异常(Runtime Exception)和受檢查的异常(Checked Exception ),運行時异常;ArithmaticException,IllegalArgumentException,編譯能通過,但是一運行就終止了,程序不會處理運行時异常,出現這類异常,程序會終止。而受檢查的异常,要麼用try。。。catch捕獲,要麼用throws字句聲明拋出,交給它的父類處理,否則編譯不會通過。

throw和throws的區別

throw:

  • throw語句用在方法體內,錶示拋出异常,由方法體內的語句處理。
  • throw是具體向外拋出异常的動作,所以它拋出的是一個异常實例,執行throw一定是拋出了某種异常。

throws:

  • throws語句是用在方法聲明後面,錶示如果拋出异常,由該方法的調用者來進行异常的處理。

  • throws主要是聲明這個方法會拋出某種類型的异常,讓它的使用者要知道需要捕獲的异常的類型。

  • throws錶示出現异常的一種可能性,並不一定會發生這種异常

final、finally、finalize的區別

  • final:用於聲明屬性,方法和類,分別錶示屬性不可變,方法不可覆蓋,被其修飾的類不可繼承。

  • finally:异常處理語句結構的一部分,錶示總是執行。

  • finalize:Object類的一個方法,在垃圾回收器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等。該方法更像是一個對象生命周期的臨終方法,當該方法被系統調用則代錶該對象即將“死亡”,但是需要注意的是,我們主動行為上去調用該方法並不會導致該對象“死亡”,這是一個被動的方法(其實就是回調方法),不需要我們調用.

版权声明:本文为[掩埋]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/08/20210815133652326d.html