程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 黑馬程序員——JAVA學習日志之異常

黑馬程序員——JAVA學習日志之異常

編輯:JAVA綜合教程

黑馬程序員——JAVA學習日志之異常


學習日志之異常

異常(異常的概述和分類)

A:異常的概述

異常就是Java程序在運行過程中出現的錯誤。異常指不期而至的各種狀況,如:文件找不到、網絡連接失敗、非法參數等。異常是一個事件,它發生在程序運行期間,干擾了正常的指令流程。

B:異常的分類

Java通過API中Throwable類的眾多子類描述各種不同的異常。因而,Java異常都是對象,是Throwable子類的實例。

通過API查看Throwable

Error

是程序無法處理的錯誤,表示運行應用程序中較嚴重問題。大多數錯誤與代碼編寫者執行的操作無關,而表示代碼運行時 JVM(Java 虛擬機)出現的問題,服務器宕機,數據庫崩潰等

Exception

是程序本身可以處理的異常。

注意:異常和錯誤的區別:異常能被程序本身可以處理,錯誤是無法處理。

C:異常的繼承體系

Throwable

Error

Exception

RuntimeException

注意:異常和錯誤的區別:異常能被程序本身可以處理,錯誤是無法處理。

 

 

JVM默認是如何處理異常的

main函數收到這個問題時,有兩種處理方式:

a:自己將該問題處理,然後繼續運行

b:自己沒有針對的處理方式,只有交給調用main的jvm來處理

jvm有一個默認的異常處理機制,就將該異常進行處理.

並將該異常的名稱,異常的信息.異常出現的位置打印在了控制台上,同時將程序停止運行

異常(try...catch的方式處理異常1)

A:異常處理的兩種方式

a:try…catch…finally

trycatch

trycatch finally

tryfinally

b:throws

try:用來檢測異常

catch:用來捕獲異常

finally:用來執行必須執行的語句。例如釋放資源。

B:try...catch處理異常的基本格式

try…catch…finally

安卓和J2EE在處理異常的區別:

安卓:因為是客戶端發開,所以通常都是將異常自己私下處理了,以確保APP的能夠繼續運行。但是這樣,異常就會被埋沒了,留下來隱患。

J2EE:因為是服務端開發,一般都是底層開發,所以異常就不可私自處理掉而留下隱患。而是將問題向上拋出,以生成日志文件。

C:案例演示

try...catch的方式處理1個異常

 


        try {
                   int x = 10,y = 0;
                     int c = x / y;
         }catch (Exception e) {
                   System.out.priintln(e);     
         }

異常(try...catch的方式處理異常2)

A:案例演示

try...catch的方式處理多個異常

         try {
         	語句1;//發生異常A ,實際運行時,程序運行到這裡就發生異常被捕獲,所以下面的語句2語句3以及捕獲它們的catch語句都不會執
         	       //行了
		語句2;//發生異常B
         	語句3;//發生異常 C
         }catch(ExceptionA) {
                   System.out.println("異常A");
         }catch(ExceptionB) {
                   System.out.println("異常B");
         }catch(ExceptionC) {
                   System.out.println("異常C");
         }

發生異常A ,實際運行時,程序運行到這裡就發生異常被捕獲,所以下面的語句2語句3以及捕獲它們的catch語句都不會執行了。

所以try後面的catch,小的異常放在前面,大的異常放後面。因為根據多態原理,大的異常會接受左右子類的對象,從而將異常吃掉,就沒法知道到底發生了具體什麼異常了。

JDK7以後處理多個異常的方式及注意事項

 

         try{
         	語句1;//發生異常A
         	語句2;//發生異常B
         }catch(ExceptionA | ExceptionB) {
                  
         }

 

 

 

異常(編譯期異常和運行期異常的區別)

通常,Java的異常(包括Exception和Error)分為可查的異常(checkedexceptions)和不可查的異常(unchecked exceptions)

 

可查異常(編譯器要求必須處置的異常)

正確的程序在運行中,很容易出現的、情理可容的異常狀況。可查異常雖然是異常狀況,但在一定程度上它的發生是可以預計的,而且一旦發生這種異常狀況,就必須采取某種方式進行處理。

除了RuntimeException及其子類以外,其他的Exception類及其子類都屬於可查異常。這種異常的特點是Java編譯器會檢查它,也就是說,當程序中可能出現這類異常,要麼用try-catch語句捕獲它,要麼用throws子句聲明拋出它,否則編譯不會通過。

不可查異常(編譯器不要求強制處置的異常):包括運行時異常(RuntimeException與其子類)和錯誤(Error)。

不可查異常在編譯的時候不會被發現,也就是編寫代碼的時候不需要拋出或處理,當程序執行的時候出現的話,程序直接停下來。

可查的異常就是在寫代碼的時候必須要處理或拋出的,如果不處理或拋出就會出現紅色報警。

Exception 這種異常分兩大類運行時異常和非運行時異常(編譯異常)。程序中應當盡可能去處理這些異常。

運行時異常:都是RuntimeException類及其子類異常,如NullPointerException(空指針異常)、IndexOutOfBoundsException(下標越界異常)等,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯誤引起的,程序應該從邏輯角度盡可能避免這類異常的發生。

運行時異常的特點是Java編譯器不會檢查它,也就是說,當程序中可能出現這類異常,即使沒有用try-catch語句捕獲它,也沒有用throws子句聲明拋出它,也會編譯通過。
非運行時異常(編譯異常):是RuntimeException以外的異常,類型上都屬於Exception類及其子類。從程序語法角度講是必須進行處理的異常,如果不處理,程序就不能編譯通過。如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常

 

異常(Throwable的幾個常見方法)

A:Throwable的幾個常見方法

a:getMessage()

獲取異常信息,返回字符串。

b:toString()

獲取異常類名和異常信息,返回字符串。

c:printStackTrace()

獲取異常類名和異常信息,以及異常出現在程序中的位置。返回值void。

B:案例演示

Throwable的幾個常見方法的基本使用

 

 

異常(throws的方式處理異常)

A:throws的方式處理異常

定義功能方法時,需要把出現的問題暴露出來讓調用者去處理。

那麼就通過throws在方法上標識。

Throws拋出異常的規則:

1) 如果是不可查異常(unchecked exception),即Error、RuntimeException或它們的子類,那麼可以不使用throws關鍵字來聲明要拋出的異常,編譯仍能順利通過,但在運行時會被系統拋出。

2)必須聲明方法可拋出的任何可查異常(checked exception)。即如果一個方法可能出現受可查異常,要麼用try-catch語句捕獲,要麼用throws子句聲明將它拋出,否則會導致編譯錯誤

3)僅當拋出了異常,該方法的調用者才必須處理或者重新拋出該異常。當方法的調用者無力處理該異常的時候,應該繼續拋出,而不是囫囵吞棗。

B:案例演示

void method() throws ExceptionA {

if(true)

throws new ExceptionA();

}

異常(throw的概述以及和throws的區別)

A:throw的概述

在功能方法內部出現某種情況,程序不能繼續運行,需要進行跳轉時,就用throw把異常對象拋出。

B:案例演示

分別演示編譯時異常對象和運行時異常對象的拋出

C:throws和throw的區別

a:throws

用在方法聲明後面,跟的是異常類名

可以跟多個異常類名,用逗號隔開

表示拋出異常,由該方法的調用者來處理

PS:就是一個聲明,告訴別人,自己可能有異常,注意下。

b:throw

用在方法體內,跟的是異常對象名

只能拋出一個異常對象名

表示拋出異常,由方法體內的語句處理

 

異常(finally關鍵字的特點及作用)

A:finally的特點

被finally控制的語句體一定會執行

特殊情況:在執行到finally之前jvm退出了(比如System.exit(0))

B:finally的作用

用於釋放資源,在IO流操作和數據庫操作中會見到

C:案例演示

finally關鍵字的特點及作用

異常(finally關鍵字的面試題)

A:面試題1

final,finally和finalize的區別

B:面試題2

如果catch裡面有return語句,請問finally的代碼還會執行嗎?如果會,請問是在return前還是return後。

當在try塊或catch塊中遇到return語句時,finally語句塊將在方法返回之前被執行。

異常(自定義異常概述和基本使用)

A:為什麼需要自定義異常

為了將異常的具體情況進一步細化。

B:自定義異常概述

繼承自Exception

繼承自RuntimeException

異常(異常的注意事項及如何使用異常處理)

A:異常注意事項

a:子類重寫父類方法時,子類的方法必須拋出相同的異常或父類異常的子類。(父親壞了,兒子不能比父親更壞)

b:如果父類拋出了多個異常,子類重寫父類時,只能拋出相同的異常或者是他的子集,子類不能拋出父類沒有的異常

c:如果被重寫的方法沒有異常拋出,那麼子類的方法絕對不可以拋出異常,如果子類方法內有異常發生,那麼子類只能try,不能throws

B:如何使用異常處理

原則:如果該功能內部可以將問題處理,用try,如果處理不了,交由調用者處理,這是用throws

區別:

後續程序需要繼續運行就try

後續程序不需要繼續運行就throws

如果JDK沒有提供對應的異常,需要自定義異常。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved