Java中異常的概述、Try…Catch、多異常處理、Throws、throw、finally、自定義異常及異常的注意事項

異常的概述

  • 異常概述
    • 異常就是Java程序在運行過程中出現的錯誤。
  • 由來
    • 問題也是現實生活中一個具體事務,也可以通過java 的類的形式進行描述,并封裝成對象。
    • 其實就是Java對不正常情況進行描述后的對象體現。

異常的分類圖解

Java異常.png

從上面的圖我們可以看到:程序的異常Throwable分為兩類

  • 程序的異常:Throwable
    • 嚴重問題:Error 我們不處理。這種問題一般都是很嚴重的,比如說內存溢出。
    • 問題:Exception
      - 編譯期問題:不是RuntimeException的異常 必須進行處理的,因為你不處理,編譯就不能通過。
      - 運行期問題:RuntimeException 這種問題我們也不處理,因為是你的問題,而且這個問題出現肯定是我們的代碼不夠嚴謹,需要修正代碼的。

如果程序出現了問題,我們沒有做任何處理,最終jvm會做出默認的處理。
把異常的名稱,原因及出現的問題等信息輸出在控制臺。


我們運行程序,可以看到異常出現了。它為什么會出現異常呢?

  • JVM的默認處理方案
    • 把異常的名稱,錯誤原因及異常出現的位置等信息輸出在了控制臺
    • 程序停止執行

我們在來理解一下JVM的默認處理方案
jvm發現運算是已經違反了數學運算規則,java將這種常見的問題進行描述,并封裝成了對象叫做ArithmeticException
當除0運算發生后,jvm將該問題打包成了一個異常對象.
并將對象拋給調用者main函數,new ArithmeticException(“/by zero”);
main函數收到這個問題時,有兩種處理方式:
- 1. 自己將該問題處理,然后繼續運行
- 2.自己沒有針對的處理方式,只有交給調用main的jvm來處理
jvm有一個默認的異常處理機制,就將該異常進行處理.并將該異常的名稱,異常的信息.異常出現的位置打印在了控制臺上
同時將程序停止運行

Try…Catch

那么我們自己如何處理異常呢?

  • 異常的處理方案
    • try…catch…finally
    • throws

**try...catch...finally的處理格式: **

try { 
     可能出現問題的代碼;
 } catch(異常名 變量) {
      針對問題的處理;
 } finally { 
     釋放資源;
 }

變形格式:

try { 
      可能出現問題的代碼;
 } catch(異常名 變量) { 
      針對問題的處理;
 }

注意:
try里面的代碼越少越好
catch里面必須有內容,哪怕是給出一個簡單的提示


多異常處理

上面我們處理了一個簡單的異常,如果我們遇到一個復雜的程序需要我們處理多個異常要怎么辦呢?下面我們來學習

  • 多異常的處理
    • 每一個寫一個try…catch(這樣有點過于麻煩)
    • 寫一個try,多個catch
try{
     ... 
}catch(異常類名 變量名) { 
     ... 
} catch(異常類名 變量名) { 
     ... 
} 
... 

注意事項: 1:能明確的盡量明確,不要用大的來處理。 2:平級關系的異常誰前誰后無所謂,如果出現了子父關系,父必須在后面。


Throwable中的方法

getMessage():獲取異常信息,返回字符串。
toString():獲取異常類名和異常信息,返回字符串。
printStackTrace():獲取異常類名和異常信息,以及異常出現在程序中的位置。返回值void。
printStackTrace(PrintStream s):通常用該方法將異常內容保存在日志文件中,以便查閱。

異常聲明Throws

有些時候,我們是可以對異常進行處理的,但是又有些時候,我們根本就沒有權限去處理某個異常?;蛘哒f,我處理不了,我就不處理了。
為了解決出錯問題,Java針對這種情況,就提供了另一種處理方案:拋出。

  • 格式:
    • throws 異常類名
    • 注意:這個格式必須跟在方法的括號后面。
public class ExceptionDemo { 
     public static void main(String[] args) { 
           System.out.println("今天天氣很好");
          try { 
               method();
          } catch (ParseException e) { 
               e.printStackTrace();
          } 
         System.out.println("但是我要在家學習");
         method2();
    } 
// 編譯期異常的拋出,編譯不通過,我們就要拋出異常了 
    public static void method() throws ParseException { 
         String s = "2016-09-03";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
       Date d = sdf.parse(s);
       System.out.println(d);
   }
  // 運行期異常的拋出
  public static void method2() throws ArithmeticException { 
       int a = 10; 
       int b = 0;
       System.out.println(a / b);
   }
}

注意:

  • 編譯期異常拋出,將來調用者必須處理。
  • 運行期異常拋出,將來調用可以不用處理。

throw

上面講了throws,那么throw又是什么鬼,怎么用,他們有什么區別呢,讓我們帶著疑問出發

  • 概念:
    throw:在功能方法內部出現某種情況,程序不能繼續運行,需要進行跳轉時,就用throw把異常對象拋出。如果出現了異常情況,我們可以把該異常拋出,這個時候的拋出的應該是異常的對象。

  • throws和throw的區別

    • throws
      • 用在方法聲明后面,跟的是異常類名
      • 可以跟多個異常類名,用逗號隔開
      • 表示拋出異常,由該方法的調用者來處理
      • throws表示出現異常的一種可能性,并不一定會發生這些異常
    • throw
      • 用在方法體內,跟的是異常對象名
      • 只能拋出一個異常對象名
      • 表示拋出異常,由方法體內的語句處理
      • throw則是拋出了異常,執行throw則一定拋出了某種異常

學了這么多異常的處理,那么我們到底該如何處理異常呢?我們來總結一下

  • 原則:如果該功能內部可以將問題處理,用try,如果處理不了,交由調用者處理,這是用throws
  • 區別:
    • 后續程序需要繼續運行就try
    • 后續程序不需要繼續運行就throws

finally

  • finally的特點
    • 被finally控制的語句體一定會執行
    • 特殊情況:在執行到finally之前jvm退出了(比如System.exit(0))
  • finally的作用
    • 用于釋放資源,在IO流操作和數據庫操作中會見到(我們后面學習中會看到)

finally的用法很簡單,這里就不舉例了,我們看一個關于finally典型的題

final,finally和finalize的區別?

final
    最終的意思,可以修飾類,成員變量,成員方法
    修飾類,類不能被繼承
    修飾變量,變量是常量
    修飾方法,方法不能被重寫
finally
    是異常處理的一部分,用于釋放資源。
    一般來說,代碼肯定會執行,特殊情況:在執行到finally之前jvm退出了
finalize
    是Object類的一個方法,用于垃圾回收

自定義異常

java不可能對所有的情況都考慮到,所以,在實際的開發中,我們可能需要自己定義異常。而我們自己隨意的寫一個類,是不能作為異常類來看的,要想你的類是一個異常類,就必須繼承自Exception或者RuntimeException

/* * 自定義異常測試類 */
public class StudentDemo { 
      public static void main(String[] args) { 
           Scanner sc = new Scanner(System.in);     
           System.out.println("請輸入學生成績:"); 
            int score = sc.nextInt(); 
            Teacher t = new Teacher(); 
             try { 
                   t.check(score); 
             }  catch (MyException e) { 
                   e.printStackTrace(); 
             } 
        }
}
/* *自定義 */
class MyException extends Exception { 
           public MyException() { } 
           public MyException(String message) {
                  super(message);
           }
}
//老師類
 class Teacher { 
          public void check(int score) throws MyException { 
               if (score > 100 || score < 0) {
                   throw new MyException("分數必須在0-100之間"); 
               } else { 
                   System.out.println("分數沒有問題"); 
          }
 }

異常注意事項
我們來學習最后一個知識點

  • 子類重寫父類方法時,子類的方法必須拋出相同的異常或父類異常的子類。
  • 如果父類拋出了多個異常,子類重寫父類時,只能拋出相同的異?;蛘呤撬淖蛹?子類不能拋出父類沒有的異常
  • 如果被重寫的方法沒有異常拋出,那么子類的方法絕對不可以拋出異常,如果子類方法內有異常發生,那么子類只能try,不能throws
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,327評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,996評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,316評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,406評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,128評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,524評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,576評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,759評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,310評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,065評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,249評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,821評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,479評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,909評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,140評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,984評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,228評論 2 375

推薦閱讀更多精彩內容