<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Java中,在程式執行過程中發生的不正常行為稱為異常。比如之前一直遇到的:
(1)算數異常
System.out.prinntln(10/0);
(2)陣列越界異常
int[] arr={1,2,3}; System.out.println(arr[5]);
(3)空指標異常
int[] arr=null; System.out.println(arr.length());
【異常的分類】
【注】編譯時出現的語法錯誤,不能稱之為異常。執行時指的是程式已經編譯通過得到class檔案了,再由JVM執行過程中出現的錯誤。
在Java中,例外處理主要的五個關鍵字:throw、try、catch、final、throws
(1)LBYL:look before you leap,在操作之前就做充足的檢查(事前防禦型)
boolean ret=false;
ret=登陸游戲();
if(!ret){
處理登陸游戲錯誤;
return;
}
ret=開始匹配();
if(!ret){
處理匹配錯誤;
return;
}
………………
缺陷:正常流程和錯誤處理程式碼混在一起,程式碼整體顯得比較混亂。
(2)EAFP:it is easier to ask forgiveness than permission,先操作,遇到問題再解決。(事後認錯型)
try{
登陸游戲();
開始匹配();
}catch(登陸游戲異常){
處理登陸游戲異常;
}catch(開始匹配異常){
處理匹配異常;
}
在Java中,可以藉助throw關鍵字,丟擲自定義異常,將錯誤資訊告知給呼叫者。語法如下:
throw new XXXException("異常產生的原因");
【例】實現一個方法,獲取陣列中任意下標位置的元素
public static int getElement(int[] array, int index){ if(null == array){ throw new NullPointerException("傳遞的陣列為null"); } if(index < 0 || index >= array.length){ throw new ArrayIndexOutOfBoundsException("傳遞的陣列下標越界"); } return array[index]; }
【注】
異常的具體處理方式,主要有兩種:異常宣告throws和try-catch捕獲處理
printStackTrace()列印異常
當前方法不處理異常,提醒方法的呼叫者處理異常。
語法格式:
修飾符 返回值型別 方法名(參數列) throws 異常型別1,異常型別2...{}
【例】載入指定的組態檔
public class Config { File file; /* FileNotFoundException : 編譯時異常,表明檔案不存在 此處不處理,也沒有能力處理,應該將錯誤資訊報告給呼叫者,讓呼叫者檢查檔案名字是否給錯誤了 */ public void OpenConfig(String filename) throws FileNotFoundException { if(filename.equals("config.ini")){ throw new FileNotFoundException("組態檔名字不對"); } // 開啟檔案 }
【注】
throws並沒有對異常真正處理,而是將異常報告給異常方法的呼叫者。如果真正要對異常進行處理,需要try-catch。
【語法如下】
try{
// 將可能出現異常的程式碼放在這裡
}catch(要捕獲的異常型別 e){
// 如果try中的程式碼丟擲異常了,此處catch捕獲時異常型別與try中丟擲的異常型別一致時,或者是try中丟擲異常的父類別時,就會被捕獲到
// 對異常就可以正常處理,處理完成後,跳出try-catch結構,繼續執行後序程式碼
}【catch(異常型別 e){
// 對異常進行處理
}finally{
// 此處程式碼一定會被執行到
}】
// 後序程式碼
// 當異常被捕獲到時,異常就被處理了,這裡的後序程式碼一定會執行
// 如果捕獲了,由於捕獲時型別不對,那就沒有捕獲到,這裡的程式碼就不會被執行
注意:
1. 【】中表示可選項,可以新增,也可以不用新增
2. try中的程式碼可能會丟擲異常,也可能不會
【注意】
由於Exception類是所有異常的子類,因此可以用這個型別來捕捉所有異常。catch進行型別匹配時,不光會匹配相同型別的異常物件,也會捕捉目標異常型別的子類物件。
在寫程式時,有些特定的程式碼,無論程式是否發生異常,都需要執行,比如程式正常開啟的資源,有時候必須對資源進行回收。另外,異常會引發程式的跳轉,可能導致有些語句執行不到,此時需要finally來解決這個問題。
【語法格式】
try{
// 可能會發生異常的程式碼
}catch(異常型別 e){
// 對捕獲到的異常進行處理
}finally{
// 此處的語句無論是否發生異常,都會被執行到
}
// 如果沒有丟擲異常,或者異常被捕獲處理了,這裡的程式碼也會執行
【問題】既然finally和try-catch-finally後的程式碼都會被執行,那為什麼還要有finally呢?
當catch沒有捕獲到異常時,此時需要JVM來捕獲異常,程式可能不能正常執行,finally後面的程式碼就不會被執行。而finally中的程式碼一定會被執行。
【注】finally中的程式碼一定會被執行,一般在其中進行資源清理的掃尾工作。
如下程式碼:
public static int func(){ try{ return 10; }finally{ return 20; } } //此時返回20;
finally執行的時機是方法返回之前(try或者catch中如果有return會在return之前執行finally)。但是如果finally中也存在return語句,那麼就會執行finally中的return,從而不會執行到try中原有的return。
關於“呼叫棧”:
方法之間存在相互呼叫的關係,可以用“呼叫棧”來描述。在JVM中有一塊記憶體空間稱之為:“虛擬機器器棧”專門儲存方法之間的呼叫關係。當程式碼中出現異常的時候,我們就可以使用e.printStackTrace();
的方法檢視出現異常程式碼的呼叫棧。
如果本方法中沒有合適的處理異常的方法,就會沿著呼叫棧向上傳遞,如果一直向上傳遞都沒有找到合適的方法,最終會交給JVM來處理,程式就會異常終止。
【程式例外處理的流程】
具體方法:
class UserNameException extends Exception { public UserNameException(String message) { super(message); } }
【注】
到此這篇關於Java 超詳細講解異常的處理的文章就介紹到這了,更多相關Java 異常內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45