世上最真情的愛戀就是你在try我在catch(這我酸了……)

2020-12-09 酷扯兒

本文轉載自【微信公眾號:五角錢的程式設計師,ID:xianglin965】經微信公眾號授權轉載,如需轉載與原文作者聯繫

一起學習、成長、溫情的熱愛生活

有一種暖男叫catch,有一種真愛叫try—catch,世上最真情的愛戀就是你在try我在catch,無論你發什麼脾氣,我都靜靜的接受,默默地處理,不管你有什麼錯,我都會原諒你,愛著你。

哈哈,那今天就來說一下下關於java的愛情故事吧

先來了解一些異常的知識,看完你就知道它的愛情了

都知道java是面向對象的語言,同樣,它也是運用面向對象的機制來處理異常的,即通過一個個的異常類來分別處理各種各樣的異常。

異常的分類如下圖所示

可以看到異常分為兩大類:

Error

Exception

,下面從這兩個方面分別討論

Error是指運行時應用程式較嚴重的問題,程序本身無法恢復的嚴重錯誤,不需要處理。

程序設計的再好,也避免不了外界的影響而引發的一些異常,這就不是異常,而是錯誤了,比如內存不足啦(

OutOfMemoryError

),虛擬機運行錯誤啦(

VirtualMachineError

),線程死鎖等等

Error表明了系統JVM已經處於不可恢復的崩潰邊緣,我們管也沒法管(

悄悄的告訴你:一般情況下遇見不到這些錯誤的,我們也不用太擔心哈,有時重啟一下就好嘍!

指java程序本身可以處理的異常事件,例如

ClassCastException

:數據類型轉換異常;

ArithmeticException

(除數為0的異常);

ArrayIndexOutOfBoundsException

(數組下標出界異常);

NullPointerException

(空指針異常);

ClassNotFoundException

(指定類不存在);

InputMismatchExceptionException

(輸入類型不匹配)等等這些的異常異常分為

RuntimeException

CheckedException

注意一點就是咱們現在所說的比如

這種是一類異常,它下面可以派生出來好多的異常,是一類,這可不是一個異常,記好啊,下面分別說明一下這兩種異常

運行時異常,例如數組下標越界,空指針異常,除數為0異常,對象轉換異常等,這些異常在編譯器那是檢查不出來的,編譯器有點笨,它只能檢查一些基本的語法錯誤,像這種的邏輯錯誤它是檢查不出的。

這類異常一般不必要用異常機制來處理,我們通常會採用增加邏輯處理來避免這些異常的產生。eg:對於除數為0的異常,我們可以在除數那加上一個if判斷語句,判斷除數是否為0,不為0才讓它執行語句塊中的內容。

不廢話,上代碼

public class Test01 {public static void main(String[] args) { //分母為0異常 int b=0; if(b!=0){ //避免出現java.lang.ArithmeticException異常,給它加個if判斷語句就可以了 System.out.println(1/b); } //空指針異常 String str=null; if(str!=null){ System.out.println(str.charAt(0)); //charAt是提取下標為0的字符,避免出現空指針異常:java.lang.NullPointerException,加一個非空判斷 } //數組下標越界異常 int i[]=new int[5]; int a=5; if(a<i.length){ //避免java.lang.ArrayIndexOutOfBoundsException下標越界異常,增加關於邊界的判斷 System.out.println(i[a]); } //類型轉換錯誤 Animal dog=new Dog(); //強制類型轉換易出現的錯誤(編譯看左,運行看右) if(dog instanceof Cat){ //避免java.lang.ClassCastException類型轉換錯誤,可以用instanceof二元運算符,注意:左邊對象,右邊類 Cat cat=(Cat)dog; } }}class Animal{}class Dog extends Animal{}class Cat extends Animal{}

我們把所有不是RuntimeException的異常都看成為可檢查異常,也就是編譯器異常。

這類異常在編譯時就必須做出處理,否則無法通過編譯

處理這類異常有兩種方式:使用try—catch捕獲異常(java的神仙cp出場啦),使用throws聲明異常

try—catch—finally

我們可以先想一下地鐵的安保機制,是不是乘地鐵的人進去是不是要過一下安檢,假如小王的身上帶了把來福去乘坐地鐵,過安檢的時候機器檢測到他身上有危險物品是不是會發出報警聲,然後地鐵的相關安保人員過來處理這個異常

java的異常處理機制跟地鐵的安保機制也很相似:

try用來檢查異常的語句,如果出現異常,則把異常拋給catch,catch通過異常的類型來捕獲處理它,最後一步是通過finally為異常處理提供一個統一的出口。

要點:

try語句指定了一段代碼,該代碼就是異常捕獲並處理的範圍,在執行過程中,當任意條語句發生異常,則會跳過後面的代碼跳到該異常所對應的catch語句塊中,語句塊執行後不會再返回去執行沒執行的代碼一個try語句至少帶有一個catch語句或一個finaly語句一個try可有多條catch語句,用於處理可能產生不同類型的異常對象catch中異常對象的常用方法toString():顯示異常的類名與產生異常的原因getMessage():只顯示產生異常的原因printStactTrance():用來跟蹤異常事件發生時堆棧的內容catch捕獲異常應遵循子類異常在前,父類異常在後的原則finally所指定的代碼不管是否發生了異常都要被執行,代碼通常是關閉程序塊中已打開的資源,eg:關閉文件流,釋放資源,關閉文件,關閉資料庫等finally最多只能由一條,根據自己的需要可有可無即使try和catch中存在return語句,finally也會執行,是執行完finally語句後再通過return退出上代碼

import java.util.InputMismatchException;import java.util.Scanner;public class Test08 {public static void main(String[] args){ int a,b; System.out.println("請輸入兩個數:"); Scanner myin=new Scanner(System.in); try{//檢測是否有錯誤 a=myin.nextInt();//1.如果輸入的不是int類型,程序出錯。提出問題 b=myin.nextInt(); System.out.println(a/b);//2.除數可能為零 int arr[]={1,2,3,4,5}; System.out.println(arr[5]); //3.數組下標越界 System.out.println("try中的語句"); }catch(InputMismatchException e){ e.printStackTrace();; }catch(ArithmeticException e){ e.printStackTrace(); }catch(ArrayIndexOutOfBoundsException e){ e.printStackTrace(); } System.out.println("程序繼續向下執行:"); }}

代碼中有三處可出現異常提示,可以發現,如果你輸入一個字母的話,它就會在第一個異常處報錯,即

InputMismatchException

(輸入數據類型錯誤),try中後面的它就不會再去執行了;同樣如何我們輸入12,0的話,就會引發第二處異常錯誤,即

(除數為0錯誤),同樣後面語句也不在執行;同樣如果我們前兩處沒有錯誤,就會到第三個地方報錯,即

(數組元素下標越界錯誤);

throws

有一種懶漢員工叫throws,甭管有啥事都往外拋,做錯事了就交給上級擦屁股,上級不會再給上級,給到老闆為止,老闆要是也不會,公司就over了

發生時,我們也可以不立即處理它,也可以把這個異常給throws拋出去,也就是「它有異常,誰調它誰來處理」

如果一個方法中產生了某種異常,但是我們不確定如何來處理這種異常,就可以在方法的開頭就聲明出該方法可能拋出的異常

如果一個方法拋出多個異常,就必須在方法的開頭列出所有的異常,用逗號分隔(我感覺throws往上拋異常挺爽的哈哈)

import java.util.Scanner;public class Test08 {public static void main(String[] args) throws Exception{//我再把異常往上拋,拋給main方法,main方法再拋就要拋給虛擬機,讓虛擬機給你處理 myTest(); } public static void myTest() throws Exception{//我太懶了,就直接用個Exception給全部異常包含住了哈哈 int a,b; System.out.println("請輸入兩個數:"); Scanner myin=new Scanner(System.in); a=myin.nextInt();//1.如果輸入的不是int類型,程序出錯。提出問題 b=myin.nextInt(); System.out.println(a/b);//2.除數可能為零 int arr[]={1,2,3,4,5}; System.out.println(arr[5]); //3.數組下標越界 System.out.println("try中的語句"); System.out.println("程序繼續向下執行:"); }

相關焦點

  • java的try、catch、finally
    這個時候就是java中的try、catch、finally大展身手的時候了。說到try、catch、finally,大家看看下面這段代碼,最後執行輸出的結果應該是什麼呢?帶著這個問題,我們往下看看吧。catch的作用就是當try塊中的代碼拋出異常時,而這個異常又正好是自己負責的,那這個catch塊就開始工作了。所以,catch是流水線質檢工人,只負責自己檢驗的那部分工作。
  • 每日乾貨丨C++異常處理入門(try和catch)
    語法錯誤是最容易發現、最容易定位、最容易排除的錯誤,程式設計師最不需要擔心的就是這種錯誤。2) 邏輯錯誤是說我們編寫的代碼思路有問題,不能夠達到最終的目標,這種錯誤可以通過調試來解決。3) 運行時錯誤是指程序在運行期間發生的錯誤,例如除數為 0、內存分配失敗、數組越界、文件不存在等。C++ 異常(Exception)機制就是為解決運行時錯誤而引入的。
  • 跟我學java編程—使用try和catch捕獲異常
    前面了解了Java異常和異常處理類,本節講述如何使用try和catch語句捕獲異常。Java程序在執行過程中如果出現異常,會自動生成一個異常對象,該異常對象將被自動提交給JVM,當JVM接收到異常對象時,會尋找能處理這一異常的代碼,並把當前異常對象交給其處理,這一過程稱為捕獲(catch)異常。如果JVM找不到可以捕獲異常的方法,則運行時系統將終止,相應的Java程序也將退出。
  • js錯誤處理,"try..catch"
    這是因為引擎無法理解該代碼。所以,try..catch 只能處理有效代碼中出現的錯誤。這類錯誤被稱為「運行時的錯誤(runtime errors)」,有時被稱為「異常(exceptions)」。BAD_CODE();} catch (e) {  alert( 'catch' );} finally {  alert( 'finally' );}這段代碼有兩種執行方式:如果你對於 「Make an error?」
  • 三道try-catch-finally題目,面試妥妥的
    所以,我先進行試題分析,最後給出答案。第一題output=「34」2.執行 foo(1)時,滿足 try 中的 If 語句,拋出異常,在 catch 中進行異常處理,雖然有 return 語句,但是 finally 中的內容必須執行,也就是說要先執行了 finally 才進行 return 操作,return 後 output += 「4」將不會再執行。所以output="23".
  • try...catch 對JS的性能影響有多大?
    處理方式一:try…catch…try{ throw new Error('錯誤信息')}catch(err){ console.log(err);}使用 try...catch 語句包裹住預期可能出現異常的方法,然後在 catch 中處理。
  • 【編碼】C++異常處理 - try,catch,throw,finally的用法
    你因此可能會認為用throw拋出一個異常到catch子句中與通過函數調用傳遞一個參數兩者基本相同.這裡面確有一些相同點,但是他們也存在著巨大的差異.讓我們先從相同點談起.。你傳遞函數參數與異常的途徑可以是傳值、傳遞引用或傳遞指針,這是相同的.但是當你傳遞參數和異常時,系統所要完成的操作過程則是完全不同的.
  • 字節碼層面理解try、catch、finally
    面試中經常有關於try、catch、finally相關的問題,今天從字節碼層面了解他們的運行流程。字節碼指令分析前面30行之前的指令對應的是try-catch中間的代碼,把fileInputStream與serverSocket初始化出來放到方法的變量表中。
  • Java 中關於 try、catch、finally 中的細節分析
    一個是t String類型,一個是e Exception 類型第[0-2]行,給第0個變量賦值「」,也就是String t="";第[3-6]行,也就是執行try語句塊 賦值語句 ,也就是 t = "try";第7行,重點是第7行,把第s對應的值"try"付給第三個變量,但是這裡面第三個變量並沒有定義,這個比較奇怪第[8-10] 行,對第0個變量進行賦值操作,也就是t="finally"通過字節碼
  • 一分鐘打通JavaScript的try-catch
    1.2 利用try-catch來解決錯誤 從圖1-2我們能看出當try中的代碼發生錯誤時,利用catch可以進行異常處理,但是當try塊中的某一塊代碼發生錯誤時,後面的代碼將不會執行,所以我們應該儘量減少try塊的代碼
  • php中try catch捕獲異常實例詳解
    (註:一定要先拋才能獲取)需要進行異常處理的代碼都必須放入 try 代碼塊內,以便捕獲可能存在的異常。每一個 try 至少要有一個與之對應的 catch。使用多個 catch可以捕獲不同的類所產生的異常。當 try 代碼塊不再拋出異常或者找不到 catch 能匹配所拋出的異常時,PHP 代碼就會在跳轉到最後一個 catch 的後面繼續執行。
  • 為什麼不推薦使用try-catch-finally處理Java異常?
    這篇文章是我近期看了《Effective java》一書中總結的,來自其中第九條。為了對其理解的更加透徹,因此重新分析了一下,並加入了一些其他點。比如finalizer、try-catch-finally、try-with-resources等等。finalizer機制可以關閉,但是其執行性不可預測,還有可能造成內存洩漏,所以一般不使用,雖然java9還提出了cleaner機制代替了finalizer機制,但是其執行依然不可預測,因此選擇就落在了try-catch-finally和try-with-resources之間。
  • Java中關於try、catch、finally中的細節分析
    一個是t String類型,一個是e Exception 類型接下來看Code部分第[0-2]行,給第0個變量賦值「」,也就是String t="";第[3-6]行,也就是執行try語句塊 賦值語句 ,也就是 t = "try";第7行,重點是第7行,把第s對應的值"try"付給第三個變量,但是這裡面第三個變量並沒有定義,這個比較奇怪
  • java中關於try、catch、finally中的細節分析
    一個是t String類型,一個是e Exception 類型接下來看Code部分第[0-2]行,給第0個變量賦值「」,也就是String t="";第[3-6]行,也就是執行try語句塊 賦值語句 ,也就是 t = "try";第7行,重點是第7行,把第s對應的值"try"付給第三個變量,但是這裡面第三個變量並沒有定義,這個比較奇怪
  • try-catch-finally中的4個巨坑,老程式設計師也搞不定!
    在 Java 語言中 try-catch-finally 看似簡單,一副人畜無害的樣子,但想要真正的「掌控」它,卻並不是一件容易的事。別的不說,咱就拿 fianlly 來說吧,別看它的功能單一,但使用起來卻「暗藏殺機」,若您不信,咱來看下面的這幾個例子...
  • Java筆試面試總結—try、catch、finally語句中有return 的各類情況
    正文本篇文章主要是通過舉例的方式來闡述各種情況,我這裡根據 try-catch-finally 語法塊分為兩種大情況討論:try-catch 語法塊和 try-catch-finally 語句塊,然後再在每種情況裡再去具體討論。
  • 面試須知(8):C#的異常處理機制(try...catch...finally)
    在 C# 語言中異常與異常處理語句包括三種形式,即 try catch、try finally、try catch finally。在上述三種異常處理的形式中所用到關鍵字其含義如下:try:一個 try 塊標識了一個將被激活的特定的異常的代碼塊。後跟一個或多個 catch 塊。
  • 面試官:當return遇到try、catch、finally時會發生什麼?
    檢查異常,編譯時被檢測的異常,需要用try、catch對異常進行處理,編譯才能通過。try,catch,finally的用法:try{//需要被檢測的異常代碼}catch(Exception e){>結果和你想的一樣嗎?
  • 【JavaScript】try..catch 不能捕獲的錯誤有哪些?注意事項又有哪些?
    1.使用 try..catch..finally..throw在 JS 中處理錯誤,我們主要使用try、catch、finally和throw關鍵字。 Missing catch or finally after try1.2 try..catch建議將try與catch塊一起使用,它可以優雅地處理try塊拋出的錯誤。
  • try..catch 不能捕獲的錯誤有哪些?注意事項又有哪些?
    1.使用 try..catch..finally..throw在 JS 中處理錯誤,我們主要使用try、catch、finally和throw關鍵字。 Missing catch or finally after try1.2 try..catch建議將try與catch塊一起使用,它可以優雅地處理try塊拋出的錯誤。