Java十分鐘精通異常處理機(jī)制
一、什么是異常
異常機(jī)制:
異常機(jī)制是指當(dāng)程序出現(xiàn)錯(cuò)誤后,程序如何處理。具體來說就是程序發(fā)生異常,異常機(jī)制提供程序的退出安全通道。
通俗來說:就是為了讓程序繼續(xù)執(zhí)行下去,不至于中斷。
程序錯(cuò)誤:
程序錯(cuò)誤分為三種:
1.編譯錯(cuò)誤
2.運(yùn)行時(shí)錯(cuò)誤
3.邏輯錯(cuò)誤。
(1)編譯錯(cuò)誤:因?yàn)槌绦驔]有遵循語法規(guī)則,編譯程序能夠自己發(fā)現(xiàn)并提示我們的錯(cuò)誤的原因和位置。
(2)運(yùn)行時(shí)錯(cuò)誤:因?yàn)槌绦蛟趫?zhí)行時(shí),運(yùn)行環(huán)境發(fā)現(xiàn)了不能執(zhí)行的操作。
(3)邏輯錯(cuò)誤:因?yàn)槌绦驔]有按照預(yù)期的邏輯順序執(zhí)行。
異常就是指程序運(yùn)行時(shí)發(fā)生錯(cuò)誤,而異常處理就是對(duì)這些錯(cuò)誤進(jìn)行處理和控制。
編譯錯(cuò)誤如下:
運(yùn)行錯(cuò)誤如下:
算數(shù)異常報(bào)錯(cuò):
二、異常的結(jié)構(gòu)圖
常見異常:
序號(hào) | 異常名稱 | 異常描述 |
---|---|---|
1 | java.lang.NullPointerException | 空指針異常:對(duì)象為空,并且調(diào)用相應(yīng)方法。 |
2 | java.lang.ClassNotFoundException | 找不到指定類 |
3 | java.lang.ArrayIndexOutOfBoundsException | 數(shù)組下標(biāo)越界 |
4 | java.lang.NumberFormatException | 數(shù)字格式化異常 |
5 | java.lang.ArithmeticException | 數(shù)學(xué)運(yùn)算異常 |
6 | java.lang.StackOverflowError | 內(nèi)存空間溢出錯(cuò)誤,方法遞歸調(diào)用中,經(jīng)常發(fā)生 |
7 | java.lang.ClassCastException | 類型轉(zhuǎn)換異常,向下轉(zhuǎn)型中經(jīng)常發(fā)生 |
8 | java.text.ParseException | 時(shí)間格式化異常,SimpleDateFormart中經(jīng)常發(fā)生 |
9 | java.util.InputMismatchException | 輸入類型不匹配異常 |
三、捕獲異常
虛擬機(jī)對(duì)異常的兩種處理方式:
- 捕獲異常
- 拋出異常
捕獲異常
try - catch - finally
- try:嘗試著執(zhí)行可能會(huì)出現(xiàn)異常的代碼
- catch:如果try中的代碼在執(zhí)行過程中,出現(xiàn)了異常,捕獲該異常,如果沒有異常,就不執(zhí)行。
- finaliy:其中的代碼塊是不管報(bào)不報(bào)錯(cuò)都會(huì)執(zhí)行的,通常用來釋放資源。
try{ //可能會(huì)出錯(cuò)的代碼塊 }catch(){ //出現(xiàn)異常后,執(zhí)行的語句 }finally{ //通常用來釋放資源 }
四、聲明和拋出異常
1.使用throws聲明異常
? 運(yùn)用于方法聲明之上,用于表示當(dāng)前方法不處理異常,而是提醒該方法的調(diào)用者來處理異常
public void fun1() throws ParseException { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = format.parse("2020-10-12"); }
2.使用throw拋出異常
? throw用在方法內(nèi),用來拋出一個(gè)異常對(duì)象,將這個(gè)異常對(duì)象傳遞到調(diào)用者處,并結(jié)束當(dāng)前方法的執(zhí)行。
public void fun2() { throw new NullPointerException("空指針異常"); System.out.println("hello world");//會(huì)報(bào)紅,提示unreachable statement,該語句不可能被執(zhí)行 }
案例:
1、嵌套try-catch
@Test public void fun2() { try { throw new Exception("非運(yùn)行時(shí)異常,哈哈哈"); } catch (Exception e) { e.printStackTrace(); try { throw new ParseException("解析異常,哈哈哈",0); } catch (Exception ex) { ex.printStackTrace(); } }finally { try { throw new TimeoutException("超時(shí)異常,哈哈哈"); } catch (TimeoutException e) { e.printStackTrace(); try { throw new SQLException("SQL異常"); } catch (SQLException ex) { ex.printStackTrace(); } } } }
2、代替返回語句
public int funR1(){ try { return 1; }catch (Exception e){ throw new RuntimeException(); } } public int funR2(){ if(true) { return 1; }else{ throw new RuntimeException(); } }
五、自定義異常
自定義異常,通常就是定義了一個(gè)繼承自Exception類的子類,那么這個(gè)類就是一個(gè)自定義異常類。通常情況下,我們都會(huì)直接繼承自Exception,一般不會(huì)繼承某個(gè)運(yùn)行時(shí)異常類。
案例如下:
public class HeroNotExistException extends RuntimeException { private String m; public String getM() { return m; } public void setM(String m) { this.m = m; } //兩個(gè)參數(shù)的有參構(gòu)造,一個(gè)傳遞給父類Throwable,一個(gè)自己用 public HeroNotExistException(String message, String m){ super(message); this.m=m; } public static void main(String[] args) { Scanner sc=new Scanner(System.in); System.out.println("請(qǐng)輸入您最欣賞的歷史人物:"); String name = sc.next(); if(name.equals("孫悟空")){ try{ throw new HeroNotExistException("英雄人物不存在","哈哈"); }catch (HeroNotExistException e){ e.printStackTrace(); System.out.println(e.getM()); } } } }
到此這篇關(guān)于Java十分鐘精通異常處理機(jī)制的文章就介紹到這了,更多相關(guān)Java 異常處理機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
myeclipse導(dǎo)出可運(yùn)行jar包簡介
這篇文章主要介紹了myeclipse導(dǎo)出可運(yùn)行jar包簡介,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11java隨機(jī)驗(yàn)證碼生成實(shí)現(xiàn)實(shí)例代碼
這篇文章主要介紹了java隨機(jī)驗(yàn)證碼生成實(shí)現(xiàn)實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05MyBatis學(xué)習(xí)教程(三)-MyBatis配置優(yōu)化
這篇文章主要介紹了MyBatis學(xué)習(xí)教程(三)-MyBatis配置優(yōu)化的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-05-05mybatis QueryWrapper的條件構(gòu)造之a(chǎn)pply、last、select解析
這篇文章主要介紹了mybatis QueryWrapper的條件構(gòu)造之a(chǎn)pply、last、select,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03Java如何實(shí)現(xiàn)海量數(shù)據(jù)判重
在海量數(shù)據(jù)如何確定一個(gè)值是否存在?這是一道非常經(jīng)典的面試場景題,那怎么回答這個(gè)問題呢?下面小編就來和大家詳細(xì)的聊一聊,感興趣的可以一起學(xué)習(xí)一下2023-09-09Java的反射機(jī)制---動(dòng)態(tài)調(diào)用對(duì)象的簡單方法
下面小編就為大家?guī)硪黄狫ava的反射機(jī)制---動(dòng)態(tài)調(diào)用對(duì)象的簡單方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-07-07Java中List Set和Map之間的區(qū)別_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
Java集合的主要分為三種類型set集,list列表,map映射,接下來通過本文給大家詳細(xì)介紹java中l(wèi)ist、Set和Map之間的區(qū)別,需要的的朋友參考下吧2017-05-05