Java_例外處理總結 - Exception Handing
本文主要是通過對Java中基本的例外處理機制的一些總結與歸納,
文章目錄
- Java_例外處理總結 - Exception Handing
- 例外是 ?
- 概述
- 一、什么時候會拋出例外?
- 二、拋出&捕獲例外?
- 1.拋出例外
- (1)throws通常在方法首部的宣告后拋出例外,
- 1、throws拋出的是可能發生的例外,(并不一定會發生這些例外)
- 2、當該方法被呼叫的時候必須捕獲,或者也可以再次拋出例外,最終由Java虛擬機處理,
- 3、用來宣告一個方法可能產生的所有例外(用,分隔), 不做任何處理而是將例外往上傳,誰呼叫我我就拋給誰,
- (2)throw關鍵字通常用在方法體中,并且拋出一個例外物件,
- 1、throw則是拋出了例外,執行throw則一定拋出了某種例外,
- 2、throw陳述句由方法體內的陳述句處理,
- 3、只能拋出一個例外物件,
- 4、有兩種方式捕獲,要么自己捕獲例外 try-catch 代碼塊,要么是拋出一個例外(throws 例外),
- 小總結
- 2.捕獲例外(try-catch-finally)
- (1)撰寫代碼需要用到例外捕獲的時候,
- (2)java中即使不會發生例外的代碼也是可以用try-catch進行捕獲,
- 三、如何拋出例外?(舉個栗子叭)
- 1、自定義介面拋出例外
- 2、自定義例外類
- 3、定義一個類去實作此介面
- 4、測驗主類加載測驗
例外是 ?
在理想狀態下,用戶輸入的資料的格式永遠都是正確的,選擇打開的檔案也一定存在,并且永遠不會出現Bug,——《Java核心技術》
為了避免用戶在程式運行的程序中出現錯誤等,Java使用了一種稱為例外處理機制的錯誤捕獲機制來進行處理例外的情況,
以下均為針對例外處理機制進行的描述與補充,
概述
Java中例外的層次結構(主要)如下圖,

由上圖可知,Throwable 是Java語言中所有錯誤和例外的類,只有作為此類(或其一個子類)的實體的物件由Java虛擬機拋出,或者可以由Java throw陳述句拋出, 類似地,只有這個類或其子類可以是catch子句中的引數型別,
補充:
unchecked:未檢查例外,
checked:已檢查例外,
| checked | unchecked |
|---|---|
| 此例外在編譯時檢查 | 此例外在編譯時不檢查,運行時會拋出例外 |
| 一個方法拋出此例外,那么它應該使用 try-catch 塊或者使用 throws 關鍵字來處理這個例外,否則的話程式會報編譯錯誤( 必須顯式地捕獲或者傳遞,不處理編譯不能通過) | 代碼不需要處理它們的例外也能通過編譯,不需要 try-catch 或 throws 機制去處理的例外,(不必捕獲或拋出,編譯可以通過) |
| 除Error或者RuntimeException的所有其他的例外 | 包括派生于Error或者RuntimeException的例外 |
一、什么時候會拋出例外?
如果遇到了無法處理的情況,那么java的方法可以拋出一個例外,那么什么情況下可能拋出例外呢?
1、用戶輸入錯誤
2、設備錯誤
3、物理限制
4、程式出現錯誤, ----- 例如,a[-1]=0會拋出ArrayIndexOutOfBoundsException的uncheck例外,
5、呼叫一個拋出已檢查的方法,----- 例如,,public FileInputStream(String name) throws FileNotFoundException
6、程式運行中發現的錯誤
7、Java虛擬機和運行時庫出現的內部錯誤
二、拋出&捕獲例外?
此章節主要是關鍵字throws、throw、和try-catch(finally)的作用及區別,
【補充】JVM對例外的處理方法 :列印例外的跟蹤堆疊資訊,并終止程式運行,
1.拋出例外
(1)throws通常在方法首部的宣告后拋出例外,
class MyAnimation{
public Image loadImage(String s) throws IOException{
...
}
}
1、throws拋出的是可能發生的例外,(并不一定會發生這些例外)
2、當該方法被呼叫的時候必須捕獲,或者也可以再次拋出例外,最終由Java虛擬機處理,
3、用來宣告一個方法可能產生的所有例外(用,分隔), 不做任何處理而是將例外往上傳,誰呼叫我我就拋給誰,
(2)throw關鍵字通常用在方法體中,并且拋出一個例外物件,
String readData(Scanner in)throws EOFException{
while(...){
if(!in.hasNext())//遇到EOFException例外
if(n<len){
throw new EOFException();
}...
}
}
1、throw則是拋出了例外,執行throw則一定拋出了某種例外,
2、throw陳述句由方法體內的陳述句處理,
3、只能拋出一個例外物件,
4、有兩種方式捕獲,要么自己捕獲例外 try-catch 代碼塊,要么是拋出一個例外(throws 例外),
小總結
------由上述throws、throw比較可知,
(1)throw拋出一個例外物件時需要由函式的上層呼叫處理這個例外,此時,可以通過try-catch(finally)代碼塊,也可以通過throws進行拋出,(一定要處理)
(2)throws拋出一個可能的例外時可以不對此例外進行處理,
編譯時例外需要手動進行處理;而運行時例外jvm會列印例外的跟蹤堆疊資訊,并終止程式運行,
所以一般運行時例外不需要手動捕獲,但編譯時例外需要手動處理,
2.捕獲例外(try-catch-finally)
(1)撰寫代碼需要用到例外捕獲的時候,
(2)java中即使不會發生例外的代碼也是可以用try-catch進行捕獲,
【注】在定義一個方法的時候,可以使用throws關鍵字宣告,使用throws宣告的方法表示此方法不處理例外,而是交給方法的呼叫處進行處理,
【注】使用了throw,拋出了例外,必然要進行捕獲和處理,就是說,必須要進行try-catch處理或者throws拋出,
使用1:
try
{
//需要被檢測的例外代碼
}catch(Exception e){
//例外處理,即處理例外的代碼(列印例外資訊并處理)
}finally{
//一定會被執行的代碼(通常可以進行資源的清除作業)
}
使用2:
try
{
//需要被檢測的例外代碼
}catch(Exception e){
//例外處理,即處理例外的代碼(列印例外資訊并處理)
}
使用3:
try
{
//需要被檢測的例外代碼
}finally{
//一定會被執行的代碼(通常可以進行資源的清除作業)
}
try
{
//需要被檢測的例外代碼
}catch(Exception e1){
//例外處理,即處理例外的代碼(列印例外資訊并處理)
}catch(IOException e2){
//例外處理,即處理例外的代碼(列印例外資訊并處理)
}//可以通過catch處理多個例外,
---------舉個栗子-------
public class TestException {
//測驗0
boolean testEx() throws Exception{
boolean res = true;
try{
res = testEx1();//執行
}catch (Exception e){
System.out.println("測驗0,捕獲例外");
res = false;
throw e;
}finally{
System.out.println("測驗0, finally 最侄訓傳的值 =" + res);
return res;
}
}
//測驗1
boolean testEx1() throws Exception{
boolean res= true;
try{
res = testEx2();
if (!res){
return false;
}
return res;
}catch (Exception e){
System.out.println("測驗1, catch捕獲");
res = false;
throw e;
}finally{
System.out.println("測驗1, finally最侄訓傳值 =" + res);
return res;
}
}
//測驗2
boolean testEx2() throws Exception{
boolean res = true;
try{
int b = 2;
int c;
for (int i = 2; i >= 0; i--){
c = b / i;
System.out.println("c="+c+"\ti=" + i);
}
return true;
}catch (Exception e){
System.out.println("測驗2, catch捕獲");
res = false;
throw e;
}finally{
System.out.println("測驗2, finally最終值 =" + res);
return res;
}
}
}//借鑒Angel_Kitty的例子
上述結果
三、如何拋出例外?(舉個栗子叭)
此節主要描述對拋出例外以及捕獲例外的整個程序的實體,包括自定義例外類等,
1、自定義介面拋出例外
public interface ComparePerson {
// 比較兩個Person,是否相等
void compareInfo(Person person1,Person person2) throws MyException;
}
2、自定義例外類
//自定義的例外類(需要繼承Exception才是例外類)
class MyException extends Exception{
public MyException(String s){//輸出例外資訊
System.out.println(s);
}
}
3、定義一個類去實作此介面
public class Person implements ComparePerson {
// 姓名
private String name;
// 年齡
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 兩個Person不相等,則拋出自定義例外,列印2個人的資訊,以及不相等的資訊
@Override
public void compareInfo(Person person1, Person person2) {
try{
System.out.println(person1.compare(person2));
}catch (MyException e){
// e.printStackTrace();
}
}
// 比較兩個物件是否相同,不相同時拋出例外并輸出例外資訊
public String compare(Object obj) throws MyException {//compareInfo方法在介面中拋出了例外,此時呼叫了compare方法也需要拋出想應的例外,
// 判斷2個物件的地址是否相同
if (this == obj) {
return "2個人屬性完全相同";
}
// 判斷obj物件是否是Person的派生類(子類)
if (obj instanceof Person) {
System.out.println("********");
Person obj1 = (Person) obj;//強制轉換一定成功
if (obj1.getName().equals(this.name) && obj1.getAge() == this.age) {
throw new MyException("2個人屬性相同!");//需要呼叫此方法的上層呼叫者throws 此例外或者使用try-catch陳述句捕獲例外,
} else if (obj1.getAge() == this.age) {
//列印物件的詳細資訊
System.out.println(this.toString());
System.out.println(obj1.toString());
throw new MyException("2個人姓名不同~");
} else if (obj1.getName().equals(this.name)) {
//列印物件的詳細資訊
System.out.println(this.toString());
System.out.println(obj1.toString());
throw new MyException("2個人年齡不同~");
}
}
return "2個人不同a";
}
//列印各引數
public String toString() {
return "name is:" + this.name + "\tage is:" + this.age;
}
//set get方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
4、測驗主類加載測驗
class TestMain {
public static void main(String[] args) throws MyException {
// 2個Person物件
Person person1 = new Person("掰掰", 18);
Person person2 = new Person("憨憨", 18);
person1.compareInfo(person1, person2);
}
}
上述結果

class TestMain {
public static void main(String[] args) throws MyException {
// 2個Person物件
Person person1 = new Person("掰掰", 18);
Person person2 = new Person("掰掰", 18);
person1.compareInfo(person1, person2);
}
}

class TestMain {
public static void main(String[] args) throws MyException {
// 2個Person物件
Person person1 = new Person("掰掰", 18);
Person person2 = new Person("掰掰", 20);
person1.compareInfo(person1, person2);
}
}

【注】上述Person類中,注釋了 e.printStackTrace()方法,如果取消注釋,會列印相應拋出的例外資訊,如下圖:

上述拋出的例外就是自定義的例外資訊,
可以拿著上述例子直接運行一下哦,還可以再此例子進行更深化的學習!
以上就是今天要講的內容,本文僅僅簡單介紹了例外處理,感謝觀看哦,歡迎評論留言,相互交流吖~@_@
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/274068.html
標籤:python

