亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

0014 異常處理

2019-11-14 09:29:43
字體:
來源:轉載
供稿:網友

異常是程序中的一些錯誤,但并不是所有的錯誤都是異常,并且錯誤有時候是可以避免的。

比如說,你的代碼少了一個分號,那么運行出來結果是提示是錯誤 java.lang.Error;

如果你用System.out.PRintln(11/0),那么你是因為你用0做了除數,會拋出 java.lang.ArithmeticException 的異常。

異常發生的原因有很多,通常包含以下幾大類:

用戶輸入了非法數據。要打開的文件不存在。網絡通信時連接中斷,或者JVM內存溢出。

這些異常有的是因為用戶錯誤引起,有的是程序錯誤引起的,還有其它一些是因為物理錯誤引起的。

要理解Java異常處理是如何工作的,你需要掌握以下三種類型的異常:

檢查性異常:最具代表的檢查性異常是用戶錯誤或問題引起的異常,這是程序員無法預見的。例如:要打開一個不存在文件時,一個異常就發生了,這些異常在編譯時不能被簡單地忽略。運行時異常: 運行時異常是可能被程序員避免的異常。與檢查性異常相反,運行時異??梢栽诰幾g時被忽略。錯誤: 錯誤不是異常,而是脫離程序員控制的問題。錯誤在代碼中通常被忽略。例如,當棧溢出時,一個錯誤就發生了,它們在編譯也檢查不到的。

Exception 類的層次

所有的異常類是從 java.lang.Exception類繼承的子類。

Exception 類是 Throwable 類的子類。除了Exception類外,Throwable還有一個子類Error 。

Java 程序通常不捕獲錯誤。錯誤一般發生在嚴重故障時,它們在Java程序處理的范疇之外。

Error 用來指示運行時環境發生的錯誤。

例如,JVM 內存溢出。一般地,程序不會從錯誤中恢復。

異常類有兩個主要的子類:IOException 類和 RuntimeException 類。


Java 內置異常類

Java 語言定義了一些異常類在 java.lang 標準包中。

標準運行時異常類的子類是最常見的異常類。由于 java.lang 包是默認加載到所有的 Java 程序的,所以大部分從運行時異常類繼承而來的異常都可以直接使用。

Java 根據各個類庫也定義了一些其他的異常,下面的表中列出了 Java 的非檢查性異常。

異常描述
ArithmeticException當出現異常的運算條件時,拋出此異常。例如,一個整數"除以零"時,拋出此類的一個實例。
ArrayIndexOutOfBoundsException用非法索引訪問數組時拋出的異常。如果索引為負或大于等于數組大小,則該索引為非法索引。
ArrayStoreException試圖將錯誤類型的對象存儲到一個對象數組時拋出的異常。
ClassCastException當試圖將對象強制轉換為不是實例的子類時,拋出該異常。
IllegalArgumentException拋出的異常表明向方法傳遞了一個不合法或不正確的參數。
IllegalMonitorStateException拋出的異常表明某一線程已經試圖等待對象的監視器,或者試圖通知其他正在等待對象的監視器而本身沒有指定監視器的線程。
IllegalStateException在非法或不適當的時間調用方法時產生的信號。換句話說,即 Java 環境或 Java 應用程序沒有處于請求操作所要求的適當狀態下。
IllegalThreadStateException線程沒有處于請求操作所要求的適當狀態時拋出的異常。
IndexOutOfBoundsException指示某排序索引(例如對數組、字符串或向量的排序)超出范圍時拋出。
NegativeArraySizeException如果應用程序試圖創建大小為負的數組,則拋出該異常。
NullPointerException當應用程序試圖在需要對象的地方使用 null 時,拋出該異常
NumberFormatException當應用程序試圖將字符串轉換成一種數值類型,但該字符串不能轉換為適當格式時,拋出該異常。
SecurityException由安全管理器拋出的異常,指示存在安全侵犯。
StringIndexOutOfBoundsException此異常由 String 方法拋出,指示索引或者為負,或者超出字符串的大小。
UnsupportedOperationException當不支持請求的操作時,拋出該異常。

下面的表中列出了 Java 定義在 java.lang 包中的檢查性異常類。

異常描述
ClassNotFoundException應用程序試圖加載類時,找不到相應的類,拋出該異常。
CloneNotSupportedException當調用 Object 類中的 clone 方法克隆對象,但該對象的類無法實現 Cloneable 接口時,拋出該異常。
IllegalaccessException拒絕訪問一個類的時候,拋出該異常。
InstantiationException當試圖使用 Class 類中的 newInstance 方法創建一個類的實例,而指定的類對象因為是一個接口或是一個抽象類而無法實例化時,拋出該異常。
InterruptedException一個線程被另一個線程中斷,拋出該異常。
NoSuchFieldException請求的變量不存在
NoSuchMethodException請求的方法不存在

異常方法

下面的列表是 Throwable 類的主要方法:

序號方法及說明
1public String getMessage()返回關于發生的異常的詳細信息。這個消息在Throwable 類的構造函數中初始化了。
2public Throwable getCause()返回一個Throwable 對象代表異常原因。
3public String toString()使用getMessage()的結果返回類的串級名字。
4public void printStackTrace()打印toString()結果和棧層次到System.err,即錯誤輸出流。
5public StackTraceElement [] getStackTrace()返回一個包含堆棧層次的數組。下標為0的元素代表棧頂,最后一個元素代表方法調用堆棧的棧底。
6public Throwable fillInStackTrace()用當前的調用棧層次填充Throwable 對象棧層次,添加到棧層次任何先前信息中。

捕獲異常

使用 try 和 catch 關鍵字可以捕獲異常。try/catch 代碼塊放在異??赡馨l生的地方。

try/catch代碼塊中的代碼稱為保護代碼,使用 try/catch 的語法如下:

try{   // 程序代碼}catch(ExceptionName e1){   //Catch 塊}

Catch 語句包含要捕獲異常類型的聲明。當保護代碼塊中發生一個異常時,try 后面的 catch 塊就會被檢查。

如果發生的異常包含在 catch 塊中,異常會被傳遞到該 catch 塊,這和傳遞一個參數到方法是一樣。

下面的例子中聲明有兩個元素的一個數組,當代碼試圖訪問數組的第三個元素的時候就會拋出一個異常。

// 文件名 : ExcepTest.javaimportjava.io.*;public classExcepTest{    public staticvoid main(Stringargs[]){        try{             int a[] =new int[2];            System.out.println("Access element three :" + a[3]);        }catch(ArrayIndexOutOfBoundsExceptione){           System.out.println("Exception thrown :" + e);        }         System.out.println("Out of the block");    }}

以上代碼編譯運行輸出結果如下:

Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3Out of the block

多重捕獲塊

一個 try 代碼塊后面跟隨多個 catch 代碼塊的情況就叫多重捕獲。

多重捕獲塊的語法如下所示:

try{    // 程序代碼}catch(異常類型1 異常的變量名1){   // 程序代碼}catch(異常類型2 異常的變量名2){   // 程序代碼}catch(異常類型2 異常的變量名2){   // 程序代碼}

上面的代碼段包含了 3 個 catch塊。

可以在 try 語句后面添加任意數量的 catch 塊。

如果保護代碼中發生異常,異常被拋給第一個 catch 塊。

如果拋出異常的數據類型與 ExceptionType1 匹配,它在這里就會被捕獲。

如果不匹配,它會被傳遞給第二個 catch 塊。

如此,直到異常被捕獲或者通過所有的 catch 塊。

try{  file = newFileInputStream(fileName);  x = (byte)file.read();}catch(IOExceptioni){  i.printStackTrace();  return -1;}catch(FileNotFoundExceptionf){//Not valid!  f.printStackTrace();  return -1;}

throws/throw 關鍵字:

如果一個方法沒有捕獲一個檢查性異常,那么該方法必須使用 throws 關鍵字來聲明。throws 關鍵字放在方法簽名的尾部。

也可以使用 throw 關鍵字拋出一個異常,無論它是新實例化的還是剛捕獲到的。

下面方法的聲明拋出一個 RemoteException 異常:

importjava.io.*;public classclassName{    public voiddeposit(doubleamount)throws RemoteException{        // Method implementation       thrownew RemoteException();   }    //Remainder of class definition}

一個方法可以聲明拋出多個異常,多個異常之間用逗號隔開。

例如,下面的方法聲明拋出 RemoteException 和 InsufficientFundsException:

importjava.io.*;public classclassName{    public voidwithdraw(doubleamount)throws RemoteException, InsufficientFundsException{         // Method implementation    }     //Remainder of class definition}

finally關鍵字

finally 關鍵字用來創建在 try 代碼塊后面執行的代碼塊。

無論是否發生異常,finally 代碼塊中的代碼總會被執行。

在 finally 代碼塊中,可以運行清理類型等收尾善后性質的語句。

finally 代碼塊出現在 catch 代碼塊最后,語法如下:

try{    // 程序代碼}catch(異常類型1 異常的變量名1){    // 程序代碼}catch(異常類型2 異常的變量名2){    // 程序代碼}finally{   // 程序代碼}publicclass ExcepTest{    public staticvoid main(Stringargs[]){         int a[] =new int[2];         try{            System.out.println("Access element three :" + a[3]);         }catch(ArrayIndexOutOfBoundsExceptione){            System.out.println("Exception thrown :" + e);         } finally{            a[0] =6;             System.out.println("First element value: " +a[0]);            System.out.println("The finally statement is executed");         }    }}

以上實例編譯運行結果如下:

Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3First element value: 6The finally statement is executed

注意事項

catch 不能獨立于 try 存在。在 try/catch 后面添加 finally 塊并非強制性要求的。try 代碼后不能既沒 catch 塊也沒 finally 塊。try, catch, finally 塊之間不能添加任何代碼。

聲明自定義異常

在 Java 中你可以自定義異常。編寫自己的異常類時需要記住下面的幾點。

所有異常都必須是 Throwable 的子類。如果希望寫一個檢查性異常類,則需要繼承 Exception 類。如果你想寫一個運行時異常類,那么需要繼承 RuntimeException 類。

可以像下面這樣定義自己的異常類:

classMyException extends Exception{}

只繼承Exception 類來創建的異常類是檢查性異常類。

下面的 InsufficientFundsException 類是用戶定義的異常類,它繼承自 Exception。

一個異常類和其它任何類一樣,包含有變量和方法。

// 文件名InsufficientFundsException.javaimportjava.io.*;public classInsufficientFundsExceptionextends Exception{    private doubleamount;     public InsufficientFundsException(doubleamount){          this.amount =amount;     }     public doublegetAmount(){          return amount;    }}

為了展示如何使用我們自定義的異常類,

// 文件名稱 CheckingAccount.javaimportjava.io.*;public classCheckingAccount{    private doublebalance;     private intnumber;     public CheckingAccount(intnumber){        this.number =number;     }     public voiddeposit(doubleamount){         balance += amount;    }     public voidwithdraw(doubleamount)throws InsufficientFundsException{          if(amount <=balance){             balance -= amount;         } else{              double needs =amount - balance;             throw newInsufficientFundsException(needs);         }     }     public doublegetBalance(){         return balance;    }     public intgetNumber(){         return number;   }}//文件名稱 BankDemo.javapublicclass BankDemo{    public staticvoid main(String[]args){          CheckingAccount c =new CheckingAccount(101);         System.out.println("Depositing $500...");         c.deposit(500.00);         try {              System.out.println("/nWithdrawing $100...");              c.withdraw(100.00);              System.out.println("/nWithdrawing $600...");              c.withdraw(600.00);         }catch(InsufficientFundsExceptione){               System.out.println("Sorry, but you are short $" +e.getAmount());              e.printStackTrace();         }     }}

編譯上面三個文件,并運行程序 BankDemo,得到結果如下所示:

Depositing $500...Withdrawing $100...Withdrawing $600...Sorry, but you are short $200.0InsufficientFundsException        at CheckingAccount.withdraw(CheckingAccount.java:25)        at BankDemo.main(BankDemo.java:13)

通用異常

在Java中定義了兩種類型的異常和錯誤。

JVM(Java虛擬機) 異常:由 JVM 拋出的異?;蝈e誤。例如:NullPointerException 類,ArrayIndexOutOfBoundsException 類,ClassCastException 類。程序級異常:由程序或者API程序拋出的異常。例如 IllegalArgumentException 類,IllegalStateException 類。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品国产91精品亚洲| 92国产精品久久久久首页| 尤物99国产成人精品视频| 国产一区二区三区精品久久久| 亚洲精品短视频| 久久精品国产2020观看福利| 欧美国产中文字幕| 国色天香2019中文字幕在线观看| 国产丝袜一区二区三区免费视频| 亚洲女人被黑人巨大进入al| 日韩国产中文字幕| 亚洲欧美国产制服动漫| 北条麻妃一区二区三区中文字幕| 久久久久国产精品免费网站| 69久久夜色精品国产7777| 日韩精品高清视频| 中国日韩欧美久久久久久久久| 午夜精品久久久久久久白皮肤| 免费97视频在线精品国自产拍| 亚洲成人中文字幕| 日韩成人在线观看| 国模私拍视频一区| 精品香蕉一区二区三区| 九九久久久久99精品| 精品国产自在精品国产浪潮| 91精品国产乱码久久久久久蜜臀| 欧美最顶级丰满的aⅴ艳星| 国产精品自产拍在线观看| 国产精品久久久久久亚洲影视| 在线观看精品国产视频| 久久久久久久久久久免费| 91亚洲精品视频| 中文字幕一区电影| 亚洲精品xxx| 欧美激情啊啊啊| 97超碰蝌蚪网人人做人人爽| 欧美日韩午夜视频在线观看| 激情懂色av一区av二区av| 亚洲小视频在线观看| 国语自产偷拍精品视频偷| 中文字幕精品影院| 黑人巨大精品欧美一区免费视频| 亚洲欧美精品suv| 欧美午夜精品伦理| 日本国产高清不卡| 亚洲色图25p| 亚洲自拍中文字幕| 日韩成人在线电影网| 国产精品老女人精品视频| 91国内产香蕉| 欧美成人免费一级人片100| 欧美激情第6页| 亚洲欧美综合区自拍另类| 一区二区三区国产在线观看| 久久香蕉国产线看观看av| 亚洲精品成人久久| 热99精品只有里视频精品| 日韩在线视频播放| 久久久国产一区二区| www.午夜精品| 亚洲欧美日韩综合| 国产精品xxx视频| 国产精品久久久久久久久久免费| 91精品国产91久久久久| 国产91精品最新在线播放| 日韩精品高清视频| 国产精品美女主播在线观看纯欲| 亚洲天堂男人天堂女人天堂| 欧美高清第一页| 国产精品久久久久久久av大片| 日韩中文字幕在线视频| 精品一区二区三区四区| 精品亚洲va在线va天堂资源站| 亚洲国内精品视频| 日韩欧美国产高清91| 国产精品一区二区久久国产| 91超碰中文字幕久久精品| 欧美日韩激情视频| 亚洲第一色中文字幕| 亚洲国产私拍精品国模在线观看| 亚洲成人av片| 国产精品视频在线观看| 亚洲欧美另类中文字幕| 国产高清视频一区三区| 在线免费观看羞羞视频一区二区| 日本亚洲精品在线观看| 国产自摸综合网| 国产精品成av人在线视午夜片| 日韩高清电影免费观看完整| 色av吧综合网| 亚洲男人的天堂在线播放| 亚洲成av人影院在线观看| 亚洲欧美在线一区二区| 国产成人综合av| 欧美激情视频免费观看| 国产精品精品一区二区三区午夜版| 欧美精品福利在线| 国产日韩欧美在线看| 欧美日韩国产二区| 隔壁老王国产在线精品| 国产亚洲精品久久久久久777| 国产精品情侣自拍| 色偷偷噜噜噜亚洲男人| 在线观看免费高清视频97| 亚洲一区二区福利| 国产亚洲精品美女久久久久| 亚洲美女在线看| 精品国产一区久久久| 亚洲成人黄色网址| 97色在线视频观看| 久久好看免费视频| 中文.日本.精品| 亚洲精品国精品久久99热一| 在线成人一区二区| 亚洲精品久久视频| 亚洲成色777777女色窝| 国产91ⅴ在线精品免费观看| 欧美国产日产韩国视频| 亚洲国产私拍精品国模在线观看| 久久久人成影片一区二区三区观看| 欧美限制级电影在线观看| 亚洲女同性videos| 国产又爽又黄的激情精品视频| 欧美日韩精品中文字幕| 亚洲免费视频在线观看| 91产国在线观看动作片喷水| 日韩视频亚洲视频| 国产成+人+综合+亚洲欧美丁香花| 欧美极品欧美精品欧美视频| 一区二区三区 在线观看视| 国内精品一区二区三区| 亚洲www永久成人夜色| 韩国一区二区电影| 日韩精品免费综合视频在线播放| 日韩激情视频在线| 欧美激情第一页xxx| 97香蕉久久超级碰碰高清版| 成人午夜激情免费视频| 91精品国产综合久久男男| 日本午夜人人精品| 欧美猛男性生活免费| 国产成人精品电影久久久| 亚洲www在线| 久久在线观看视频| 亚洲最大激情中文字幕| 国产欧美一区二区三区在线| 色综合视频一区中文字幕| 久久国产精品亚洲| 日韩有码在线视频| 日韩中文字幕在线观看| 亚洲欧洲中文天堂| 久久久免费精品视频| 伊人久久精品视频| 一区二区三区动漫| 狠狠色噜噜狠狠狠狠97| 久久人人爽人人爽人人片av高清| 国产精品免费一区豆花| 成人在线播放av| 91精品国产亚洲| 综合国产在线视频| 国产精品av在线| 欧美黑人狂野猛交老妇| 91久久久久久久一区二区| 久久久久女教师免费一区|