1. 程式人生 > >Java異常分類(一)

Java異常分類(一)

Java 中的異常簡介

程式執行時,發生的不被期望的事件,它阻止了程式按照程式設計師的預期正常執行,這就是異常。

Java提供了更加優秀的解決辦法:異常處理機制。

Throwable類是Java異常型別的頂層父類,一個物件只有是 Throwable 類的(直接或者間接)例項,他才是一個異常物件,才能被異常處理機制識別。JDK中內建了一些常用的異常類,我們也可以自定義異常。

Java異常的分類

Java標準庫內建了一些通用的異常,這些類以Throwable為頂層父類。

Throwable又派生出Error類和Exception類。

Error-錯誤:Error類以及他的子類的例項,由於這是屬於 JVM

 層次的嚴重錯誤 ,導致 JVM 無法繼續執行,因此,這是不可捕捉到的,無法採取任何恢復的操作,頂多只能顯示錯誤資訊。因此,程式設計師應該關注Exception為父類的分支下的各種異常類。

Exception-異常:Exception以及他的子類,代表程式執行時發生的各種不期望發生的事件。可以被Java異常處理機制使用,是異常處理的核心。

總體上我們根據Javac對異常的處理要求,將異常類分為2類。

非檢查異常(unckecked exception):Error 和 RuntimeException 以及他們的子類。javac在編譯時,不會提示和發現這樣的異常,不要求在程式處理這些異常。所以如果願意,我們可以編寫程式碼處理(使用try…catch…finally)這樣的異常,也可以不處理。對於這些異常,我們應該修正程式碼,而不是去通過異常處理器處理 。這樣的異常發生的原因多半是程式碼寫的有問題。如除0錯誤ArithmeticException,錯誤的強制型別轉換錯誤ClassCastException,陣列索引越界ArrayIndexOutOfBoundsException,使用了空物件NullPointerException等等。

執行時異常(runtime exception ):也稱執行時異常,我們可以不處理。當出現這樣的異常時,總是由虛擬機器 接管。比如:我們從來沒有人去處理過 NullPointerException 異常,它就是執行時異常,並且這種異常還是最常見的異常之一。

出現執行時異常後,系統會把異常一直往上層拋,一直遇到處理程式碼。如果沒有處理塊,到最上層,如果是多執行緒就由 Thread.run()丟擲 ,如果是單執行緒就被 main() 丟擲 。丟擲之後,如果是執行緒,這個執行緒也就退出了。如果是主程式丟擲的異常,那麼這整個程式也就退出了。也就是說,你如果不對執行時異常進行處理,那麼出現執行時異常之後,要麼是執行緒中止,要麼是主程式終止。

    如果不想終止,則必須撲捉所有的執行時異常,決不讓這個處理執行緒退出。佇列裡面出現異常資料了,正常的處理應該是把異常資料捨棄,然後記錄日誌。不應該由於異常資料而影響下面對正常資料的處理。 在這個場景這樣處理可能是一個比較好的應用,但並不代表在所有的場景你都應該如此。如果在其它場景,遇到了一些錯誤,如果退出程式比較好,這時你就可以不太理會執行時異常 ,或者是通過對異常的處理顯式的控制程式退出。

檢查異常(checked exception):除了Error 和 RuntimeException的其它異常。JAVA 編譯器強制要求我們必需對出現的這些異常進行 try-catch或者throws否則編譯不會通過。這樣的異常一般是由程式的執行環境導致的。如SQLException , IOException,ClassNotFoundException 等。

需要明確的是:檢查和非檢查是對於javac來說的,這樣就很好理解和區分了。

初識異常

下面的程式碼會演示2個異常型別:ArithmeticException 和 InputMismatchException。前者由於整數除0引發,後者是輸入的資料不能被轉換為int型別引發。

package com.example;

import java. util .Scanner ;

public class AllDemo

{

      public static void main (String [] args )

      {

            System . out. println( "----歡迎使用命令列除法計算器----" ) ;

            CMDCalculate ();

      }

      public static void CMDCalculate ()

      {

            Scanner scan = new Scanner ( System. in );

            int num1 = scan .nextInt () ;

            int num2 = scan .nextInt () ;

            int result = devide (num1 , num2 ) ;

            System . out. println( "result:" + result) ;

            scan .close () ;

      }

      public static int devide (int num1, int num2 ){

            return num1 / num2 ;

      }

}

/*****************************************


----歡迎使用命令列除法計算器----

0

Exception in thread "main" java.lang.ArithmeticException : / by zero

     at com.example.AllDemo.devide( AllDemo.java:30 )

     at com.example.AllDemo.CMDCalculate( AllDemo.java:22 )

     at com.example.AllDemo.main( AllDemo.java:12 )


----歡迎使用命令列除法計算器----

r

Exception in thread "main" java.util.InputMismatchException

     at java.util.Scanner.throwFor( Scanner.java:864 )

     at java.util.Scanner.next( Scanner.java:1485 )

     at java.util.Scanner.nextInt( Scanner.java:2117 )

     at java.util.Scanner.nextInt( Scanner.java:2076 )

     at com.example.AllDemo.CMDCalculate( AllDemo.java:20 )

     at com.example.AllDemo.main( AllDemo.java:12 )

*****************************************/

異常是在執行某個函式時引發的,而函式又是層級呼叫,形成呼叫棧的,因為,只要一個函式發生了異常,那麼他的所有的caller都會被異常影響。當這些被影響的函式以異常資訊輸出時,就形成的了異常追蹤棧。

異常最先發生的地方,叫做異常丟擲點。

從上面的例子可以看出,當devide函式發生除0異常時,devide函式將丟擲ArithmeticException異常,因此呼叫他的CMDCalculate函式也無法正常完成,因此也傳送異常,而CMDCalculate的caller——main 因為CMDCalculate丟擲異常,也發生了異常,這樣一直向呼叫棧的棧底回溯。這種行為叫做異常的冒泡,異常的冒泡是為了在當前發生異常的函式或者這個函式的caller中找到最近的異常處理程式。由於這個例子中沒有使用任何異常處理機制,因此異常最終由main函式拋給JRE,導致程式終止。

上面的程式碼不使用異常處理機制,也可以順利編譯,因為2個異常都是非檢查異常。但是下面的例子就必須使用異常處理機制,因為異常是檢查異常。

程式碼中我選擇使用throws宣告異常,讓函式的呼叫者去處理可能發生的異常。但是為什麼只throws了IOException呢?因為FileNotFoundException是IOException的子類,在處理範圍內。

相關推薦

Java異常分類()

Java 中的異常簡介 程式執行時,發生的不被期望的事件,它阻止了程式按照程式設計師的預期正常執行,這就是異常。 Java提供了更加優秀的解決辦法:異常處理機制。 Throwable類是Java異常型別的頂層父類,一個物件只有是 Throwable 類的(直接或者間接)

Java 異常分類及統一處理(

一、異常分類 java異常分為”檢查”和”非檢查”兩類,”檢查”二字的意思是,程式碼編譯時,編譯器會去Check一下有沒有進行異常處理(捕獲或向上拋),對於歸類為需要檢查的異常,若沒處理,編譯就過不去。 初學的時候,常常想為啥異常要這樣分類處理? 後來明白了些,異常不過兩種:主觀和客觀,一個大多

Java異常

error: 數組下標 發生 str 最簡 integer heap throwable 提示 *************************如何處理異常******************************** try{ //可能出現錯誤的代碼 }catch(

Java 異常分類及處理機制

 1. 引子        try…catch…finally恐怕是大家再熟悉不過的語句了,而且感覺用起來也是很簡單,邏輯上似乎也是很容易理解。不過,我親自體驗的“教訓”告訴我,這個東西可不是想象中的那麼簡單、聽話。不信?那你看看下面的程式碼,“猜猜”它執行後的結果會是什麼?

Java 異常分類及統一處理

一、異常分類 java異常分為”檢查”和”非檢查”兩類,”檢查”二字的意思是,程式碼編譯時,編譯器會去Check一下有沒有進行異常處理(捕獲或向上拋),對於歸類為需要檢查的異常,若沒處理,編譯就過不去。 初學的時候,常常想為啥異常要這樣分類處理? 後來明白了

java異常分類

Java中異常的分類         所有異常,都繼承自java.lang.Throwable類。         Throwable有兩個直接子類,Error類和Exception類。Exception         Exception則可使從任何標準Java庫的類方法

java 異常分類和處理機制

    一、背景介紹       程式在執行過程中發生錯誤或異常情況是不可避免的,如果每一個執行時錯誤都由程式設計師手動控制和處理,其工作量是不可想象的。     Java語言中的異常處理機制就解決的上述問題,把錯誤與異常的管理帶到了面向物件的世界Java語言定義了很多異常類

Java 異常異常概述及其架構

Java 異常(一) 異常概述及其架構 一、異常概述 (一)、概述 Java異常是Java提供的一種識別及響應錯誤的一致性機制。異常指的是程式在執行過程中,出現的非正常的情況,最終會導致JVM的非正常停止。Java異常機制可以使程式中異常處理程式碼和正常業務程式碼分離,保證程式程式碼更加優雅,並提高程式健壯性

Java基礎(異常處理關鍵字:try catch finally throw throws

cut main 5.1 模型 指針 str control 情況 實例   嗨咯,大家晚上好,我的博客首篇開始了 ,我們一起加油吧! 都說java 語言是非常健壯性 如:垃圾回收機制、內存模型、異常處理,強類型轉換、跨平臺,等等,使得Java語言的受到青睞。今天我們先來聊

深入理解Java虛擬機——java內存區域與內存溢出異常

線程 文件的 語言 沒有 虛擬 深入理解java 十倍 並且 周期 Java虛擬機全稱:java virtual machine;是Java開發語言中,用來運行Java字節碼文件的平臺;通俗的講,就是一個程序。它提供對Java字節碼的解釋及運行,從而使Java語言能獨立於各

java中的異常

數組 col logs exception 並且 test 但是 blog ring java異常的概念 執行期的錯誤(javac xxx.java) 運行期的錯誤(java xxx) 這裏講的是運行期出現的錯誤 class TestEx { public s

Java核心技術卷 5. java異常、斷言和日誌

form 什麽 表示 ase ... per 分解 new 測試 處理錯誤 由於出現錯誤而使得某些操作沒有完成,程序因該: 返回到一種安全狀態,並能夠讓用戶執行一些其他命令 允許用戶保存所有操作的結果,並以適當的方式終止程序 需要關註的問題: 用戶輸入錯誤 設備錯誤

每日題:Java異常處理

增加 異常處理 int throwable 邏輯 現實 inter throws 運行時 什麽是異常 在理想情況下,程序總會運行在很完美的環境中,網絡不會終端,文件一定存在,程序不會有 BUG。但是,理想很豐滿,現實很骨幹,實際生產環境中,網絡可能會中斷,文件可能會找不到,

XF文章筆記之《Java異常》認識異常流程()

別名 XF 最近在看了一些改善程式碼的原則,重溫下基礎,而又不可忽視的重點區域,記錄下來。 認識異常流執行機制 異常流類似於goto語句,java中沒有goto語句,但是異常採用了類似的技術。一旦一個異常誕生,控制流(control)就會立刻轉入下面三者之一 catc

JAVA異常處理機制()

異常處理機制try-catch 語法定義: try{ //可能出現異常的程式碼片段 }catch(XXXException e){ //捕獲try中出現的XXXException後的處理操作程式碼 } try-catch演示 public class Try_CatchDe

【詳】JAVA異常分類以及異常處理方法之間的區別以及聯絡

異常在日長開發中就像看見地鐵裡邊的人頭一樣的,放眼望去,齊刷刷的一片,各種異常。分佈範圍比較廣泛,很多人看到異常,就這表情 JAVA中異常: NullPointerException 空指標異常

java異常-條sql在Navicat裡能查出資料,但是mybatis查不出來

1、xml裡把#換成$接收引數,不預編譯(比如in查詢時,拼裝好的ids) 2、可能是映射出錯。(resultMap錯了或者resultType錯了) resultMap可以連續寫多個。 3、引數錯了,多了符號。比如 需要 id= '87adbdd21e61267ee

java異常:2、異常分類?Exception、Error

宣告:本教程不收取任何費用,歡迎轉載,尊重作者勞動成果,不得用於商業用途,侵權必究!!! 文章目錄 簡介 Error類 Exception類 異常分類 簡介 Java中所有的異常都由類來表示。 所有的異常類都是從java.lang包中的一個名為Throwabl

java 流的分類java流總結

首先,流是什麼? 流是個抽象的概念,是對輸入輸出裝置的抽象,Java程式中,對於資料的輸入/輸出操作都是以“流”的方式進行。裝置可以是檔案,網路,記憶體等。 如果資料的流向是程式至裝置,我們成為輸出流,反之我們稱為輸入流。 流有哪些分類? 可以從不同的角度

Java異常處理:給程式罩層保險

文/沉默王二 人這一生,總會遇到一些不可預料的麻煩,這些麻煩可能會讓我們遭受沉重的打擊。為了減輕因此承受的負擔,我們就會買保險。 本著負責任的態度,我們程式設計師在寫程式碼的時候,都非常的嚴謹。但程式在執行的時候,往往會出現一些令人意想不到的錯誤,導致那些不被期望的事件發生,最終,程式沒有按照我們的預