欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java異常簡(jiǎn)介和架構(gòu)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

 更新時(shí)間:2017年06月16日 10:58:28   作者:skywang12345  
這篇文章主要分享了Java異常簡(jiǎn)介和架構(gòu),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

Java異常簡(jiǎn)介

  Java異常是Java提供的一種識(shí)別及響應(yīng)錯(cuò)誤的一致性機(jī)制。

  Java異常機(jī)制可以使程序中異常處理代碼和正常業(yè)務(wù)代碼分離,保證程序代碼更加優(yōu)雅,并提高程序健壯性。在有效使用異常的情況下,異常能清晰的回答what, where, why這3個(gè)問(wèn)題:異常類(lèi)型回答了“什么”被拋出,異常堆棧跟蹤回答了“在哪“拋出,異常信息回答了“為什么“會(huì)拋出。
Java異常機(jī)制用到的幾個(gè)關(guān)鍵字:try、catch、finally、throw、throws。
• try        -- 用于監(jiān)聽(tīng)。將要被監(jiān)聽(tīng)的代碼(可能拋出異常的代碼)放在try語(yǔ)句塊之內(nèi),當(dāng)try語(yǔ)句塊內(nèi)發(fā)生異常時(shí),異常就被拋出。
• catch   -- 用于捕獲異常。catch用來(lái)捕獲try語(yǔ)句塊中發(fā)生的異常。
• finally  -- finally語(yǔ)句塊總是會(huì)被執(zhí)行。它主要用于回收在try塊里打開(kāi)的物力資源(如數(shù)據(jù)庫(kù)連接、網(wǎng)絡(luò)連接和磁盤(pán)文件)。只有finally塊,執(zhí)行完成之后,才會(huì)回來(lái)執(zhí)行try或者catch塊中的return或者throw語(yǔ)句,如果finally中使用了return或者throw等終止方法的語(yǔ)句,則就不會(huì)跳回執(zhí)行,直接停止。
• throw   -- 用于拋出異常。
• throws -- 用在方法簽名中,用于聲明該方法可能拋出的異常。 

下面通過(guò)幾個(gè)示例對(duì)這幾個(gè)關(guān)鍵字進(jìn)行簡(jiǎn)單了解。

示例一: 了解try和catch基本用法

public class Demo1 {

  public static void main(String[] args) {
    try {
      int i = 10/0;
       System.out.println("i="+i); 
    } catch (ArithmeticException e) {
       System.out.println("Caught Exception"); 
      System.out.println("e.getMessage(): " + e.getMessage()); 
      System.out.println("e.toString(): " + e.toString()); 
      System.out.println("e.printStackTrace():");
      e.printStackTrace(); 
    }
  }
}

運(yùn)行結(jié)果:

Caught Exception
e.getMessage(): / by zero
e.toString(): java.lang.ArithmeticException: / by zero
e.printStackTrace():
java.lang.ArithmeticException: / by zero
    at Demo1.main(Demo1.java:6)

結(jié)果說(shuō)明:在try語(yǔ)句塊中有除數(shù)為0的操作,該操作會(huì)拋出java.lang.ArithmeticException異常。通過(guò)catch,對(duì)該異常進(jìn)行捕獲。

觀察結(jié)果我們發(fā)現(xiàn),并沒(méi)有執(zhí)行System.out.println("i="+i)。這說(shuō)明try語(yǔ)句塊發(fā)生異常之后,try語(yǔ)句塊中的剩余內(nèi)容就不會(huì)再被執(zhí)行了。 

示例二: 了解finally的基本用法
在"示例一"的基礎(chǔ)上,我們添加finally語(yǔ)句。

public class Demo2 {

  public static void main(String[] args) {
    try {
      int i = 10/0;
       System.out.println("i="+i); 
    } catch (ArithmeticException e) {
       System.out.println("Caught Exception"); 
      System.out.println("e.getMessage(): " + e.getMessage()); 
      System.out.println("e.toString(): " + e.toString()); 
      System.out.println("e.printStackTrace():");
      e.printStackTrace(); 
    } finally {
      System.out.println("run finally");
    }
  }
}

運(yùn)行結(jié)果:

Caught Exception
e.getMessage(): / by zero
e.toString(): java.lang.ArithmeticException: / by zero
e.printStackTrace():
java.lang.ArithmeticException: / by zero
    at Demo2.main(Demo2.java:6)
run finally

結(jié)果說(shuō)明:最終執(zhí)行了finally語(yǔ)句塊。 

示例三: 了解throws和throw的基本用法
throws是用于聲明拋出的異常,而throw是用于拋出異常。

class MyException extends Exception {
  public MyException() {}
  public MyException(String msg) {
    super(msg);
  }
}

public class Demo3 {

  public static void main(String[] args) {
    try {
      test();
    } catch (MyException e) {
      System.out.println("Catch My Exception");
      e.printStackTrace();
    }
  }
  public static void test() throws MyException{
    try {
      int i = 10/0;
       System.out.println("i="+i); 
    } catch (ArithmeticException e) {
      throw new MyException("This is MyException"); 
    }
  }
}

運(yùn)行結(jié)果:

Catch My Exception
MyException: This is MyException
    at Demo3.test(Demo3.java:24)
    at Demo3.main(Demo3.java:13)

結(jié)果說(shuō)明:

  MyException是繼承于Exception的子類(lèi)。test()的try語(yǔ)句塊中產(chǎn)生ArithmeticException異常(除數(shù)為0),并在catch中捕獲該異常;接著拋出MyException異常。main()方法對(duì)test()中拋出的MyException進(jìn)行捕獲處理。 

Java異常框架

Java異常架構(gòu)圖

1. Throwable

  Throwable是 Java 語(yǔ)言中所有錯(cuò)誤或異常的超類(lèi)。
  Throwable包含兩個(gè)子類(lèi): Error 和 Exception。它們通常用于指示發(fā)生了異常情況。
  Throwable包含了其線(xiàn)程創(chuàng)建時(shí)線(xiàn)程執(zhí)行堆棧的快照,它提供了printStackTrace()等接口用于獲取堆棧跟蹤數(shù)據(jù)等信息。

2. Exception

  Exception及其子類(lèi)是 Throwable 的一種形式,它指出了合理的應(yīng)用程序想要捕獲的條件。

3. RuntimeException 

  RuntimeException是那些可能在 Java 虛擬機(jī)正常運(yùn)行期間拋出的異常的超類(lèi)。
  編譯器不會(huì)檢查RuntimeException異常。例如,除數(shù)為零時(shí),拋出ArithmeticException異常。RuntimeException是ArithmeticException的超類(lèi)。當(dāng)代碼發(fā)生除數(shù)為零的情況時(shí),倘若既"沒(méi)有通過(guò)throws聲明拋出ArithmeticException異常",也"沒(méi)有通過(guò)try...catch...處理該異常",也能通過(guò)編譯。這就是我們所說(shuō)的"編譯器不會(huì)檢查RuntimeException異常"!
  如果代碼會(huì)產(chǎn)生RuntimeException異常,則需要通過(guò)修改代碼進(jìn)行避免。例如,若會(huì)發(fā)生除數(shù)為零的情況,則需要通過(guò)代碼避免該情況的發(fā)生!

4. Error

  和Exception一樣,Error也是Throwable的子類(lèi)。它用于指示合理的應(yīng)用程序不應(yīng)該試圖捕獲的嚴(yán)重問(wèn)題,大多數(shù)這樣的錯(cuò)誤都是異常條件。
  和RuntimeException一樣,編譯器也不會(huì)檢查Error。 

Java將可拋出(Throwable)的結(jié)構(gòu)分為三種類(lèi)型:被檢查的異常(Checked Exception),運(yùn)行時(shí)異常(RuntimeException)和錯(cuò)誤(Error)。

(01) 運(yùn)行時(shí)異常

定義: RuntimeException及其子類(lèi)都被稱(chēng)為運(yùn)行時(shí)異常。
特點(diǎn): Java編譯器不會(huì)檢查它。也就是說(shuō),當(dāng)程序中可能出現(xiàn)這類(lèi)異常時(shí),倘若既"沒(méi)有通過(guò)throws聲明拋出它",也"沒(méi)有用try-catch語(yǔ)句捕獲它",還是會(huì)編譯通過(guò)。例如,除數(shù)為零時(shí)產(chǎn)生的ArithmeticException異常,數(shù)組越界時(shí)產(chǎn)生的IndexOutOfBoundsException異常,fail-fail機(jī)制產(chǎn)生的ConcurrentModificationException異常等,都屬于運(yùn)行時(shí)異常。
  雖然Java編譯器不會(huì)檢查運(yùn)行時(shí)異常,但是我們也可以通過(guò)throws進(jìn)行聲明拋出,也可以通過(guò)try-catch對(duì)它進(jìn)行捕獲處理。
  如果產(chǎn)生運(yùn)行時(shí)異常,則需要通過(guò)修改代碼來(lái)進(jìn)行避免。例如,若會(huì)發(fā)生除數(shù)為零的情況,則需要通過(guò)代碼避免該情況的發(fā)生!

(02) 被檢查的異常

定義: Exception類(lèi)本身,以及Exception的子類(lèi)中除了"運(yùn)行時(shí)異常"之外的其它子類(lèi)都屬于被檢查異常。
特點(diǎn): Java編譯器會(huì)檢查它。此類(lèi)異常,要么通過(guò)throws進(jìn)行聲明拋出,要么通過(guò)try-catch進(jìn)行捕獲處理,否則不能通過(guò)編譯。例如,CloneNotSupportedException就屬于被檢查異常。當(dāng)通過(guò)clone()接口去克隆一個(gè)對(duì)象,而該對(duì)象對(duì)應(yīng)的類(lèi)沒(méi)有實(shí)現(xiàn)Cloneable接口,就會(huì)拋出CloneNotSupportedException異常。
  被檢查異常通常都是可以恢復(fù)的。

(03) 錯(cuò)誤

定義: Error類(lèi)及其子類(lèi)。
特點(diǎn): 和運(yùn)行時(shí)異常一樣,編譯器也不會(huì)對(duì)錯(cuò)誤進(jìn)行檢查。
  當(dāng)資源不足、約束失敗、或是其它程序無(wú)法繼續(xù)運(yùn)行的條件發(fā)生時(shí),就產(chǎn)生錯(cuò)誤。程序本身無(wú)法修復(fù)這些錯(cuò)誤的。例如,VirtualMachineError就屬于錯(cuò)誤。
  按照J(rèn)ava慣例,我們是不應(yīng)該是實(shí)現(xiàn)任何新的Error子類(lèi)的!
對(duì)于上面的3種結(jié)構(gòu),我們?cè)趻伋霎惓;蝈e(cuò)誤時(shí),到底該哪一種?《Effective Java》中給出的建議是:對(duì)于可以恢復(fù)的條件使用被檢查異常,對(duì)于程序錯(cuò)誤使用運(yùn)行時(shí)異常。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot手寫(xiě)一個(gè)自己的starter源碼

    springboot手寫(xiě)一個(gè)自己的starter源碼

    在本篇文章里小編給大家整理了關(guān)于springboot手寫(xiě)一個(gè)自己的starter源碼的全部知識(shí)點(diǎn)內(nèi)容,需要的朋友們學(xué)習(xí)下。
    2019-06-06
  • java 單例模式和工廠模式實(shí)例詳解

    java 單例模式和工廠模式實(shí)例詳解

    這篇文章主要介紹了Java設(shè)計(jì)模式編程中的單例模式和簡(jiǎn)單工廠模式以及實(shí)例,使用設(shè)計(jì)模式編寫(xiě)代碼有利于團(tuán)隊(duì)協(xié)作時(shí)程序的維護(hù),需要的朋友可以參考下
    2017-04-04
  • java.lang.Runtime.exec() Payload知識(shí)點(diǎn)詳解

    java.lang.Runtime.exec() Payload知識(shí)點(diǎn)詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于java.lang.Runtime.exec() Payload知識(shí)點(diǎn)相關(guān)內(nèi)容,有興趣的朋友們學(xué)習(xí)下。
    2020-03-03
  • Spring注解實(shí)現(xiàn)自動(dòng)裝配過(guò)程解析

    Spring注解實(shí)現(xiàn)自動(dòng)裝配過(guò)程解析

    這篇文章主要介紹了Spring注解實(shí)現(xiàn)自動(dòng)裝配過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Mybatis-plus一對(duì)多分頁(yè)數(shù)據(jù)條數(shù)不正確的處理

    Mybatis-plus一對(duì)多分頁(yè)數(shù)據(jù)條數(shù)不正確的處理

    這篇文章主要介紹了Mybatis-plus一對(duì)多分頁(yè)數(shù)據(jù)條數(shù)不正確的處理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • spring mvc中@PathVariable / 帶斜杠方式獲取

    spring mvc中@PathVariable / 帶斜杠方式獲取

    這篇文章主要介紹了spring mvc中@PathVariable / 帶斜杠方式獲取,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java常用流程控制語(yǔ)句實(shí)現(xiàn)原理解析

    Java常用流程控制語(yǔ)句實(shí)現(xiàn)原理解析

    這篇文章主要介紹了Java常用流程控制語(yǔ)句實(shí)現(xiàn)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Spring中的集合注入代碼實(shí)例

    Spring中的集合注入代碼實(shí)例

    這篇文章主要介紹了Spring中的集合注入代碼實(shí)例,集合注入是指在Spring框架中,通過(guò)配置文件或注解的方式將集合類(lèi)型的數(shù)據(jù)注入到Bean中,集合類(lèi)型包括List、Set、Map和Properties等,需要的朋友可以參考下
    2023-11-11
  • Java實(shí)現(xiàn)的獲取和判斷文件頭信息工具類(lèi)用法示例

    Java實(shí)現(xiàn)的獲取和判斷文件頭信息工具類(lèi)用法示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的獲取和判斷文件頭信息工具類(lèi),結(jié)合實(shí)例形式分析了Java針對(duì)文件讀取及頭信息判斷相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11
  • 簡(jiǎn)單的用java實(shí)現(xiàn)讀/寫(xiě)文本文件的示例

    簡(jiǎn)單的用java實(shí)現(xiàn)讀/寫(xiě)文本文件的示例

    同時(shí)也展示了如果從輸入流中讀出來(lái)內(nèi)容寫(xiě)入輸出流中(僅限文本流) 三個(gè)例子可以獨(dú)立存在,所以根據(jù)需要只看其中一個(gè)就行了。
    2008-07-07

最新評(píng)論