摘要:程序塊若有異常發(fā)生,程序的運行便重點,并拋出異常類所產(chǎn)生的對象。關(guān)鍵字我們可以使用關(guān)鍵字把可能拋出的異常顯式的標注在方法定義的位置從而提醒調(diào)用者要注意捕獲這些異常。
JAVA提供強大的異常處理機制,在Java中,所有的異常都會被封裝到一個類中,程序出錯時會將異常拋出。
代碼中的錯誤是客觀存在的,沒有十全十美的代碼,代碼多到一定程序,我們就需要不斷維護、檢查代碼的錯誤,確保健壯性。
在Java中,我們有以下兩種方式告訴程序代碼發(fā)生錯誤:
簡單來說就是第一種沒有使用異常,第二采用了異常的方法
代碼風格如下:
LBYL: Look Before You Leap. 在操作之前就做充分的檢查:
boolean ret = false;ret = 登陸游戲();if (!ret) { 處理登陸游戲錯誤; return; }ret = 開始匹配();if (!ret) { 處理匹配錯誤; return; }ret = 游戲確認();if (!ret) { 處理游戲確認錯誤; return; }ret = 選擇英雄();if (!ret) { 處理選擇英雄錯誤; return; }ret = 載入游戲畫面();if (!ret) { 處理載入游戲錯誤; return; }......
It’s Easier to Ask Forgiveness than Permission. “事后獲取原諒比事前獲取許可更容易”. 也就是先操作, 遇到問題再處理:
try { 登陸游戲(); 開始匹配(); 游戲確認(); 選擇英雄(); 載入游戲畫面(); ...} catch (登陸游戲異常) { 處理登陸游戲異常;} catch (開始匹配異常) { 處理開始匹配異常;} catch (游戲確認異常) { 處理游戲確認異常;} catch (選擇英雄異常) { 處理選擇英雄異常;} catch (載入游戲畫面異常) { 處理載入游戲畫面異常; }.....
對比兩種不同風格的代碼, 我們可以發(fā)現(xiàn):
使用第一種方式, 正常流程和錯誤處理流程代碼混在一起, 代碼整體顯的比較混亂.
而第二種方式正常流程和錯誤流程是分離開的, 更容易理解代碼
所謂異常指的就是程序在 運行時出現(xiàn)錯誤時通知調(diào)用者的一種機制
異常的種類有很多, 不同種類的異常具有不同的含義, 也有不同的處理方式,下面介紹幾種常見異常:
public static void main(String[] args) { //1.算術(shù)異常 System.out.println(10/0); }
public static void main(String[] args) { int []arr=new int[4]; System.out.println(arr[10]); }
public static void main(String[] args) { String str=null; System.out.println(str.length()); }
異常處理是由try、catch與finally等3個關(guān)鍵字組成的程序塊。
其異常的基本語法:
try{ 要檢查的程序語句; ... }catch(異常類 對象名稱){ 異常發(fā)生時的處理語句; }[catch(異常類 對象名稱){ 異常發(fā)生時的處理語句; }catch(異常類 對象名稱){ 異常發(fā)生時的處理語句; } ...][finally{ 一定會運行到的程序代碼; }]
異常的處理流程如下:
【注意】
finally塊時可以省略的,如果省略了finally塊,那么在catch()塊運行結(jié)束后,程序?qū)⑻絫ry-catch塊之后繼續(xù)執(zhí)行。
流程圖如下:
下面看一個例子:
不進行異常處理:
public static void main(String[] args) { int[] arr = {1, 2, 3}; System.out.println(arr[10]); }
使用異常處理就能正常編譯:
public static void main(String[] args) { int[] arr = {1, 2, 3}; try{ System.out.println(arr[10]); }catch (ArrayIndexOutOfBoundsException e){ System.out.println("我在這里捕捉到一個異常"); } System.out.println("hello!!!"); }
如果我想要知道詳細的異常信息的話,則需要使用異常對象的printStackTrace()方法:
【異常處理機制小結(jié)】
當異常發(fā)生時,通常用兩種方法處理:
習慣上將Error類與Exception類統(tǒng)稱為異常類,但二者本質(zhì)上是不同點。
Error類通常指的是Java虛擬機出錯,用戶無法在程序里處理這種錯誤。
Exception類包含了一般性的異常,這些異常在捕捉到之后便可做妥善的處理,以確保程序繼續(xù)運行。
下面是異常處理的流程:
我們可以使用 throws 關(guān)鍵字, 把可能拋出的異常顯式的標注在方法定義的位置. 從而提醒調(diào)用者要注意捕獲這些異常。
格式如下:
訪問權(quán)限 返回值類型 方法名稱(參數(shù)列表)throws 異常類{ //方法體;}
上面格式包括兩個部分:一個普通方法的定義,與方法定義模式無區(qū)別。方法后面緊跟”throws異常類“,它位于方法體{ }之前,用來檢測當前方法是否有異常,若有,則將該異常提交給直接使用這個方法的方法。
//定義私有化靜態(tài)方法,并使用throws拋出異常 //一旦方法出現(xiàn)異常,setZero()方法自己并不處理,而是將異常提交給它的上級調(diào)用這main()方法 private static void setZero(int[] arr,int index)throws ArrayIndexOutOfBoundsException{ arr[index]=0; } public static void main(String[] args) { int []arr=new int[5]; try{ setZero(arr,10); }catch (ArrayIndexOutOfBoundsException e){ System.out.println("數(shù)組超出綁定方位!"); System.out.println("異常:"+e); } System.out.println("main()方法結(jié)束!"); }
上面的所有異常類對象全部都是由JVM自動實例化的,但優(yōu)勢我們也想能進行異常類對象的實例化操作,手工拋出異常,則此時需要throw關(guān)鍵字。
public static void main(String[] args) { try { //拋出異常的實例化對象 throw new ArrayIndexOutOfBoundsException("/n我是手工異常:/n數(shù)組下標越界"); }catch (ArrayIndexOutOfBoundsException e){ System.out.println(e); } }
為了處理各種異常,Java可通過繼承的方式運行用戶編寫自己的異常類,因為所有可處理的異常均繼承自Exception類,因此自定義異常類也不例外。
語法如下:
class 異常名稱 extends Exception{...}
我們可以在自定義異常類里編寫方法處理相關(guān)時間,甚至不編寫任何語句也可以正常工作,因為父類Exception已提供相當豐富的方法,通過幾次子類均可以使用它們。
static class MyException extends Exception{ public MyException(String msg){ super(msg);//調(diào)用Exception類的構(gòu)造方法,存入異常信息 } } public static void main(String[] args) { try{ throw new MyException("自定義異常"); } catch (MyException e) { e.printStackTrace(); System.out.println(e); } }
前路漫漫啊,前路漫漫啊…
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/125643.html
摘要:前言面試中對于技術(shù)職位,一般分筆試與面談,如果面試官的一些小問題你可以立馬找到對應的知識點擴展開來,那么這就是你的優(yōu)勢,本系列將講述一些面試中的事,不會很詳細,但是應該比較全面吧。 前言 面試中對于技術(shù)職位,一般分筆試與面談,如果面試官的一些小問題你可以立馬找到對應的知識點擴展開來,那么這就是你的優(yōu)勢,本系列將講述一些java面試中的事,不會很詳細,但是應該比較全面吧。 主要內(nèi)容 說到...
摘要:沒有操作符重載。最終類型在所有情況下應該是默認的,并用作為修飾符。這樣就會減少現(xiàn)在你會在和一些第三方的中見到的那些令人困惑的歷史遺留方法。在用過或是最新的之后你會覺得非常的繁瑣。這是最常見的關(guān)于的吐槽,但它這就是事實。 啊哈Reddit,沒了你我們還能在哪里從魚目混珠的網(wǎng)絡(luò)中提煉真正的精華?就在這雜亂無章的論壇中,的的確確存在著這樣一些精辟的討論。 比如有個叫Shambloroni的...
摘要:阻塞,非阻塞首先,阻塞這個詞來自操作系統(tǒng)的線程進程的狀態(tài)模型網(wǎng)絡(luò)爬蟲基本原理一后端掘金網(wǎng)絡(luò)爬蟲是捜索引擎抓取系統(tǒng)的重要組成部分。每門主要編程語言現(xiàn)未來已到后端掘金使用和在相同環(huán)境各加載多張小圖片,性能相差一倍。 2016 年度小結(jié)(服務器端方向)| 掘金技術(shù)征文 - 后端 - 掘金今年年初我花了三個月的業(yè)余時間用 Laravel 開發(fā)了一個項目,在此之前,除了去年換工作準備面試時,我并...
摘要:阻塞,非阻塞首先,阻塞這個詞來自操作系統(tǒng)的線程進程的狀態(tài)模型網(wǎng)絡(luò)爬蟲基本原理一后端掘金網(wǎng)絡(luò)爬蟲是捜索引擎抓取系統(tǒng)的重要組成部分。每門主要編程語言現(xiàn)未來已到后端掘金使用和在相同環(huán)境各加載多張小圖片,性能相差一倍。 2016 年度小結(jié)(服務器端方向)| 掘金技術(shù)征文 - 后端 - 掘金今年年初我花了三個月的業(yè)余時間用 Laravel 開發(fā)了一個項目,在此之前,除了去年換工作準備面試時,我并...
摘要:現(xiàn)在終止一個線程,基本上只能靠曲線救國式的中斷來實現(xiàn)。中斷機制的核心在于中斷狀態(tài)和異常中斷狀態(tài)設(shè)置一個中斷狀態(tài)清除一個中斷狀態(tài)方法同時會返回線程原來的中斷的狀態(tài)。中斷異常中斷異常一般是線程被中斷后,在一些類型的方法如中拋出。 前言 系列文章目錄 線程中斷是一個很重要的概念,通常,取消一個任務的執(zhí)行,最好的,同時也是最合理的方法,就是通過中斷。 本篇我們主要還是通過源碼分析來看看中斷的概...
閱讀 3734·2023-01-11 11:02
閱讀 4244·2023-01-11 11:02
閱讀 3050·2023-01-11 11:02
閱讀 5180·2023-01-11 11:02
閱讀 4733·2023-01-11 11:02
閱讀 5533·2023-01-11 11:02
閱讀 5313·2023-01-11 11:02
閱讀 3986·2023-01-11 11:02