異常—詳解

2020-12-06 全棧技術資源社區

1)異常定義

異常是指在程序在執行過程中,JVM的非正常停止,Java中異常本身就是一個類,產生異常意味著創建並拋出了一個異常對象 ,JVM處理異常的方法就是終止程序。

2)異常體系

Exception:編譯期異常,進行編譯(寫代碼)java程序出現的問題

手搓

RuntimeException:運行期異常,java程序運行過程中出現的問題

JVM

2.Error異常處理

內存溢出錯誤,數組太大,只能修改

Error: OutOfMemoryError: Java heap space

int[] arr = new int[1024*10240000*10000000*10000000];

3.Exception異常處理(非常重要)

①throw:在指定的方法內部拋出指定異常

特點:假裝沒有發生

throw 必須在方法內部使用,new的對象必須是Exception或其子類對象throw的原則(拋出):把這個異常對象傳遞到調用者處,並結束當前方法的執行//2種RTE異常,JVM來處理,throw出去

1.NullPointerException

int[] arr = null;

int e = getElement(arr,0);

2.ArrayIndexOutOfBoundsException

int[] arr = new int[3];

int e = getElement(arr,3);

public static int getElement(int[] arr,int index){

if(arr == null)//合法性判斷

throw new ArrayIndexOutOfBoundsException("傳遞的數組的值是null");

if(index<0 || index>arr.length-1)//合法性判斷

throw new ArrayIndexOutOfBoundsException("傳遞的索引超出了數組的使用範圍");

int ele = arr[index];

return ele;

}

②throws:拋出異常給方法調用者

特點:一路向北

方法內的throw拋出了編譯時異常,沒有處理,就需要throws拋出讓調用者處理

throws必須在方法尾部聲明,聲明的只能是Exception及其子類throws的原則(拋出):當前方法不處理異常,只提醒該方法的調用者處理方法中throw拋多少,方法屁股throws拋多少(只拋父類就行)調用throws方法:

(1).continue throws 給方法調用者,直到jvm中止程序

(2).try catch

代碼演示:

//1.throw時出錯

public static void readFile(String fileName) {

if(!fileName.equals("c:\\a.txt"))

throw new FileNotFoundException("傳遞的文件路徑不是c:\\a.txt");

//throw這裡編譯期異常,裂開了需要throws

public static void readFile(String fileName) throws FileNotFoundException

//2.執行到main方法,readFile報錯,繼續拋出

public static void main(String[] args) {

readFile("c:\\a.tx");//裂開了

System.out.println("路徑沒有問題,讀取文件");

public static void main(String[] args)throws Exception

'經歷2次拋出,路徑沒有問題,讀取文件'

//可以只拋出最高的父類

FileNotFoundException extends IOException extends Exception

public static void readFile(String fileName) throws FileNotFoundException,IOException{

...

if(!fileName.endsWith(".txt"))

throw new IOException("文件的後綴名不對");

public static void readFile(String fileName) throws IOException

public static void readFile(String fileName) throws Exception

③try catch:自身含有解決異常的邏輯

特點:直面困難

throws處理的缺點,主函數拋出給JVM,程序停止,後續代碼無法執行,引入try

public static void main(String[] args)throws Exception {

readFile("d:\\a.txt");

System.out.println("後續代碼");//不會執行

使用格式:

try{

可能產生異常的代碼

}catch(異常類名 變量名){//用來接收try中拋出的異常對象

...異常處理方法

catch(異常類名 變量名){

try中可能拋幾個異常,用幾個catch接

try中有異常產生,立即執行對應catch處理,完畢後執行tc外的代碼,不會再執行try中的代碼如果try中無異常,就不會執行catch,會把try中的代碼執行完,再執行tc外的代碼

public static void main(String[] args) {

readFile("c:\\a.txt");

System.out.println("資源釋放");

}catch (FileNotFoundException e) {//子類要在上

System.out.println("catch - 文件路徑錯誤");

catch (IOException e) {

System.out.println("catch - 文件後綴錯誤");

System.out.println("後續代碼");

//拋出給try解決

public static void readFile(String fileName) throws IOException {

throw new IOException("文件的後綴名不對呀");

System.out.println("後綴沒有問題");

System.out.println("路徑沒有問題");

readFile("c:\\a.txt");//後續代碼依舊會執行

後綴沒有問題

路徑沒有問題

資源釋放

後續代碼

④finally:執行try裡拋出異常之後不執行的代碼

特點:給try擦屁股的媽媽

readFile("c:\\a.tx");

} catch (IOException e) {

e.printStackTrace();

} finally {

System.out.println("資源釋放");//必定會執行!!!

finally裡面不要寫return!!!

若finally有return語句,永遠返回finally中的結果

int a = getA();

System.out.println(a);

public static int getA(){

int a = 10;

return a;

}catch (Exception e){

System.out.println(e);

//一定會執行的代碼

a = 100;

4.捕獲多個異常

1. 一個try對應一個catch

int[] arr = {1,2,3};

System.out.println(arr[3]);//ArrayIndexOutOfBoundsException: 3

}catch (ArrayIndexOutOfBoundsException e){

List<Integer> list = List.of(1, 2, 3);

System.out.println(list.get(3));//IndexOutOfBoundsException: Index 3 out-of-bounds for length 3

}catch (IndexOutOfBoundsException e){

2. 一個try對應多個catch(處理完一個注釋掉,再處理另一個)

//System.out.println(arr[3]);//ArrayIndexOutOfBoundsException: 3

//子類需要在上否則,子類多餘,父類可以完成全部功能,通過父類完成實際上是一種多態

3. 一個try對應最頂層的catch(處理完一個注釋掉,再處理另一個)

5.Throwable類列印異常信息

String getMessage() 簡短描述

String toString() 詳細消息

void printStackTrace() 最全面的

System.out.println(e.getMessage());//文件的後綴名不對呀

System.out.println(e);//java.io.IOException: 文件的後綴名不對呀

System.out.println(e.toString());//重寫Object類的toString java.io.IOException: 文件的後綴名不對呀

e.printStackTrace();//有多少打多少

6.自定義異常

自定義異常類必須以Exception結尾,代表它是一個異常類自定義異常類必須繼承Exception或者RuntimeException其一public class XXXExcepiton extends Exception | RuntimeException{

添加一個空參數的構造方法

添加一個帶異常信息的構造方法

public class RegisterException extends /*Exception*/ RuntimeException{

//添加一個空參數的構造方法

public RegisterException(){

super();

public RegisterException(String message){

super(message);

1)自定義異常demo

/*

要求:我們模擬註冊操作,如果用戶名已存在,則拋出異常並提示:親,該用戶名已經被註冊。

分析:

1.使用數組保存已經註冊過的用戶名(資料庫)

2.使用Scanner獲取用戶輸入的註冊的用戶名(前端,頁面)

3.定義一個方法,對用戶輸入的中註冊的用戶名進行判斷

用輸入的用戶名和數組保存的用戶名比較

true:

用戶名已經存在,拋出RegisterException異常,告知用戶"親,該用戶名已經被註冊";

false:

繼續遍歷比較到循環結束,還沒有找到重複的用戶名,提示用戶"恭喜您,註冊成功!";

*/

public class DemoRegisterException {

// 1.使用數組保存已經註冊過的用戶名(資料庫)

static String[] usernames = {"張三","李四","王五"};

public static void main(String[] args) throws RegisterException {

//2.使用Scanner獲取用戶輸入的註冊的用戶名(前端,頁面)

Scanner sc = new Scanner(System.in);

System.out.println("請輸入您要註冊的用戶名:");

String username = sc.next();

checkUsername(username);

//3.定義一個方法,對用戶輸入的中註冊的用戶名進行判斷

public static void checkUsername(String username) throws RegisterException {

//遍歷存儲已經註冊過用戶名的數組,獲取每一個用戶名

for (String name : usernames) {

//使用獲取到的用戶名和用戶輸入的用戶名比較

if(name.equals(username)){

//true:用戶名已經存在,拋出RegisterException異常,告知用戶"親,該用戶名已經被註冊";

throw new RegisterException("親,該用戶名已經被註冊");//拋出運行期異常,無需處理,交給JVM處理,中斷處理

//如果循環結束了,還沒有找到重複的用戶名,提示用戶"恭喜您,註冊成功!";

System.out.println("恭喜您,註冊成功!");

//也可以不throws,用try

相關焦點

  • 詳解CAN總線幾種正常的「異常」波形
    其實並非如此,今天就把CAN總線上的幅值「異常」歸歸類。本文引用地址:http://www.eepw.com.cn/article/201807/384622.htm一、CAN-bus信號產生原理眾所周知,一個標準CAN節點由微處理器、控制器、收發器構成。多個節點成總線型架構掛在一起,兩個端節點上並有終端電阻。其結構簡圖如下圖所示。
  • 《流放之路》女巫背景天賦及升華詳解
    今天小編就為大家帶來流放之路女巫背景及升華詳解,感興趣的朋友們快來看看吧! 女巫背景及升華詳解 女巫介紹 女巫智慧型... 流放之路遊戲中的女巫是智慧型人物,主要發展方向是法術,召喚,圖騰,元素,護盾。今天小編就為大家帶來流放之路女巫背景及升華詳解,感興趣的朋友們快來看看吧!
  • 《王者榮耀》三個異常點在哪 調查虛影任務完成攻略
    導 讀 王者榮耀調查虛影任務三個異常點怎麼找到?
  • 高考生物一輪複習 | 酶和ATP專題,附答案詳解~
    【詳解】A、酶只能在活細胞中產生,但酶並不只在細胞內發揮作用。15.細胞代謝過程中會產生異常蛋白,異常蛋白積累會引起細胞凋亡。泛素(Ub)與異常蛋白結合後會一起被蛋白酶體水解。如圖為異常蛋白水解的機制。
  • 《怪物獵人:世界》蒼火龍招式及打法詳解
    《怪物獵人世界》中的蒼火龍是火龍的亞種,在血量和技能上都有著明顯的增強,就好像玩家初入上位狩獵櫻火龍一樣,初見可能不是很好打,於是小編就為大家帶來了由「強擊瓶大劍」分享的《怪物獵人世界》蒼火龍招式及弓箭打法視頻詳解
  • 火影忍者ol異常狀態疊加問題及驅散含義解析
    大家好,今天聚俠小編為大家帶來 火影忍者ol異常狀態疊加問題及驅散含義解析。想要了解具體內容的遊戲玩家,快跟聚俠小編一起來看看吧。 首先 提一下火影ol裡的各種異常狀態 : A類:麻痺、減速 B類:定身、混亂、睡眠、封穴、致盲 C類:降抗防 D類:點燃、中毒 E類:標記 對應的解除順序: 1.上述分類按解除優先級排列順序,無視施加順序。
  • 《一起來捉妖》日遊神怎麼樣 日遊神技能詳解
    技能詳解: 一技能、強光閃爍 魔法傷害+眩暈,閃爍強光攻擊,造成法術攻擊力傷害並眩暈敵人一小段時間。 被動技能、聚焦 傷害增加,敵人每有一種異常狀態(沉默、禁錮、眩暈),都能使日遊神對其造成更高的傷害,所以日遊神適合什麼樣的隊友小夥伴們應該都清楚了。 日遊神是一個優秀的法術輸出妖靈,能夠在敵方處於異常狀態下對其造成大量傷害,因為這個被動,所以很需要隊友的搭配。
  • 《缺氧》後期新手玩法詳解 缺氧後期問題詳解
    今天小編為大家帶來了缺氧後期問題分析,下面一起來看看缺氧後期問題詳解吧! 後期問題詳解 1.無限生存問題 看之前討論無限生存的問題都只是在談物質的循環,但還有能... 大家知道缺氧後期有什麼問題嗎?今天小編為大家帶來了缺氧後期問題分析,下面一起來看看缺氧後期問題詳解吧!
  • 基金會異常等級劃分詳解
    SCP異常的等級劃分讓大家對於一個SCP有了一個直觀且簡單的第一印象,給一個異常指定項目等級已經是創作的必要部分,而一個異常SCP的項目等級的劃分卻不是一個簡單的問題,它需要作者考慮多種因素才能決定。02Safe安全SCP異常中最安全的一個等級,劃分一個SCP為Safe的依據並非是它沒有任何的危險,更大程度上只是異常較為容易被收容
  • 詳解斷路器當中的符號分別代表什麼
    打開APP 詳解斷路器當中的符號分別代表什麼 工程師之餘 發表於 2018-10-31 14:50:17 關於斷路器,簡單的來說是一種開關設備,可以在正常電路條件下關閉,傳輸和中斷電流,並且可以在指定時間關閉並傳輸電流以進行異常循環。
  • 2014山東醫療衛生考試臨床備考:詳解「過敏」—四型超敏反應的區別
    2014山東醫療衛生考試臨床備考:詳解「過敏」—四型超敏反應的區別 超敏反應又稱變態反應,俗稱「過敏」,指機體受到某些抗原刺激時,出現生理功能紊亂或組織細胞損傷的異常適應性免疫應答/病理性免疫應答。
  • 夾絲玻璃材質製作工藝詳解 夾絲玻璃材質的分類詳解
    夾絲玻璃材質製作工藝詳解 工藝技術進步和人們審美意識提升,使得夾絲玻璃在日常生活中被大量使用,夾絲玻璃指的就是採用壓延工藝生產製作出來的一種安全玻璃。成卷金屬絲網由供網裝置展開後送往熔融玻璃液體中,和玻璃液一起通過上、下壓延輥後製成。
  • 一文詳解HDMI製造過程
    打開APP 一文詳解HDMI製造過程 線纜行業朋友圈 發表於 2021-01-09 11:17:48 隨著HDMI2.1認證的開啟
  • 集和誠科技的KAGO系列邊緣控制器詳解
    打開APP 集和誠科技的KAGO系列邊緣控制器詳解 集和誠科技 發表於 2020-08-30 09:38:14 邊緣控制器在邊緣計算中的作用詳解 邊緣計算作為雲計算的一項重要補充,在構建互聯工廠中的作用正越來越受到重視。
  • 高分四號衛星特色應用詳解
    高分四號衛星特色應用詳解 2020-09-13 10:38 來源:澎湃新聞·澎湃號·政務
  • 關於汙泥指數(SVI)的詳解!
    關於汙泥指數(SVI)的詳解!北極星水處理網訊:1、汙泥指數(SVI)的定義汙泥指數又稱汙泥容積指數(SVI),是衡量活性汙泥沉降性能的指標。指曝氣池混合液經30min沉澱後, 相應的1g幹汙泥所佔的容積(以mL計), 單位mL/g 。
  • 活性汙泥法中汙泥濃度MLSS詳解!
    活性汙泥法中汙泥濃度MLSS詳解!北極星水處理網訊:活性汙泥法的運行需要眾多控制參數的合理調控,其中包括活性汙泥濃度(MLSS)的控制,它是汙水系統日常運行中最常用的指標之一。對此,今天針對MLSS的定義和其他指標關係進行詳細的介紹。 1.
  • 天宮加點技巧詳解[多圖]
    天宮的加點方式多種多樣,很多小夥伴不知道天宮加點怎樣選,下面就給大家帶來天宮加點技巧詳解。 天天宮加點技巧詳解 玩天宮,其實不推薦新人用全力加點。老手全力加是因為他們會配裝備,讓天宮搶到物理一速,然後穿雲、亂神一頓亂秀。新手加全力很容易導致一個結果,天宮沒對面天策、萬獸快。然後亂神廢一半,想穿雲經常血線不夠被罰站,完全體會不到天宮的樂趣。
  • 陌陌是什麼 陌陌使用方法詳解【詳解】-太平洋IT百科手機版
    通過陌陌可以更加便捷的通過地理位置信息,發現附近的人,更加便捷的與人進行即時的互動 下面,我們就來看看陌陌使用方法詳解。   1、百度搜索「陌陌」,進入官網下載。  2、進入官網,然後點立即下載,根據手機系統,選擇下載到手機,再安裝。  3、然後就是登陸手機陌陌,註冊陌陌帳號,添加好友。
  • JavaScript數組 - 引用詳解
    基本數據類型詳解在學習數組引用詳解前,我們先來看基本數據類型的詳解舉個小例子:我們聲明一個a = 10;然後聲明一個函數,這個函數裡面有個參數為a把這個參數的a改成5,a = 5; 並且再加上alert(a);函數外我們先去alert(a);再調用這個函數把a寫在裡面傳進去