Java学习(三)面向对象异常
異常:★★★★
異常:就是不正常。程序在運行時出現的不正常情況。其實就是程序中出現的問題。這個問題按照面向對象思想進行描述,并封裝成了對象。因為問題的產生有產生的原因、有問題的名稱、有問題的描述等多個屬性信息存在。當出現多屬性信息最方便的方式就是將這些信息進行封裝。異常就是java按照面向對象的思想將問題進行對象封裝。這樣就方便于操作問題以及處理問題。
?
出現的問題有很多種,比如角標越界,空指針等都是。就對這些問題進行分類。而且這些問題都有共性內容比如:每一個問題都有名稱,同時還有問題描述的信息,問題出現的位置,所以可以不斷的向上抽取。形成了異常體系。
?
--------java.lang.Throwable:
Throwable:可拋出的。
??? |--Error:錯誤,一般情況下,不編寫針對性的代碼進行處理,通常是jvm發生的,需要對程序進行修正。
??? |--Exception:異常,可以有針對性的處理方式
?
無論是錯誤還是異常,它們都有具體的子類體現每一個問題,它們的子類都有一個共性,就是都以父類名才作為子類的后綴名。
?
這個體系中的所有類和對象都具備一個獨有的特點;就是可拋性。
可拋性的體現:就是這個體系中的類和對象都可以被throws和throw兩個關鍵字所操作。
------------------------------------------------------
class? ExceptionDemo{
??? public static void main(String[] args) {
//????? byte[] buf = new byte[1024*1024*700];//java.lang.OutOfMemoryError內存溢出錯誤
??? }
}
------------------------------------------------------
在開發時,如果定義功能時,發現該功能會出現一些問題,應該將問題在定義功能時標示出來,這樣調用者就可以在使用這個功能的時候,預先給出處理方式。
?
如何標示呢?通過throws關鍵字完成,格式:throws 異常類名,異常類名...
這樣標示后,調用者,在使用該功能時,就必須要處理,否則編譯失敗。
?
處理方式有兩種:1、捕捉;2、拋出。
對于捕捉:java有針對性的語句塊進行處理。
try {
??? 需要被檢測的代碼;
}
catch(異常類 變量名){
??? 異常處理代碼;
}
fianlly{
??? 一定會執行的代碼;
}
--------------------------------------------------------
catch (Exception e) { //e用于接收try檢測到的異常對象。
??? System.out.println("message:"+e.getMessage());//獲取的是異常的信息。
??? System.out.println("toString:"+e.toString());//獲取的是異常的名字+異常的信息。
??? e.printStackTrace();//打印異常在堆棧中信息;異常名稱+異常信息+異常的位置。
}
---------------------------------------------------------
異常處理原則:功能拋出幾個異常,功能調用如果進行try處理,需要與之對應的catch處理代碼塊,這樣的處理有針對性,拋幾個就處理幾個。
?
特殊情況:try對應多個catch時,如果有父類的catch語句塊,一定要放在下面。
?
throw 和throws關鍵字的區別:
throw用于拋出異常對象,后面跟的是異常對象;throw用在函數內。
throws用于拋出異常類,后面跟的異常類名,可以跟多個,用逗號隔開。throws用在函數上。
?
通常情況:函數內容如果有throw,拋出異常對象,并沒有進行處理,那么函數上一定要聲明,否則編譯失敗。但是也有特殊情況。
?
異常分兩種:
1:編譯時被檢查的異常,只要是Exception及其子類都是編譯時被檢測的異常。
2:運行時異常,其中Exception有一個特殊的子類RuntimeException,以及RuntimeException的子類是運行異常,也就說這個異常是編譯時不被檢查的異常。
?
編譯時被檢查的異常和運行時異常的區別:
編譯被檢查的異常在函數內被拋出,函數必須要聲明,否編譯失敗。
聲明的原因:是需要調用者對該異常進行處理。
運行時異常如果在函數內被拋出,在函數上不需要聲明。
不聲明的原因:不需要調用者處理,運行時異常發生,已經無法再讓程序繼續運行,所以,不讓調用處理的,直接讓程序停止,由調用者對代碼進行修正。
?
定義異常處理時,什么時候定義try,什么時候定義throws呢?
功能內部如果出現異常,如果內部可以處理,就用try;
如果功能內部處理不了,就必須聲明出來,讓調用者處理。
?
自定義異常:當開發時,項目中出現了java中沒有定義過的問題時,這時就需要我們按照java異常建立思想,將項目的中的特有問題也進行對象的封裝。這個異常,稱為自定義異常。
?
對于除法運算,0作為除數是不可以的。java中對這種問題用ArithmeticException類進行描述。對于這個功能,在我們項目中,除數除了不可以為0外,還不可以為負數。可是負數的部分java并沒有針對描述。所以我們就需要自定義這個異常。
?
自定義異常的步驟:
1:定義一個子類繼承Exception或RuntimeException,讓該類具備可拋性。
2:通過throw 或者throws進行操作。
?
異常的轉換思想:當出現的異常是調用者處理不了的,就需要將此異常轉換為一個調用者可以處理的異常拋出。
?
try? catch? finally的幾種結合方式:
?
|
?
?
|
?
1,
try
catch
finally
?
這種情況,如果出現異常,并不處理,但是資源一定關閉,所以try? finally集合只為關閉資源。
記住:finally很有用,主要用戶關閉資源。無論是否發生異常,資源都必須進行關閉。
System.exit(0); //退出jvm,只有這種情況finally不執行。
?
當異常出現后,在子父類進行覆蓋時,有了一些新的特點:
1:當子類覆蓋父類的方法時,如果父類的方法拋出了異常,那么子類的方法要么不拋出異常要么拋出父類異常或者該異常的子類,不能拋出其他異常。
2:如果父類拋出了多個異常,那么子類在覆蓋時只能拋出父類的異常的子集。
?
注意:
如果父類或者接口中的方法沒有拋出過異常,那么子類是不可以拋出異常的,如果子類的覆蓋的方法中出現了異常,只能try不能throws。
如果這個異常子類無法處理,已經影響了子類方法的具體運算,這時可以在子類方法中,通過throw拋出RuntimeException異常或者其子類,這樣,子類的方法上是不需要throws聲明的。
?
常見異常:
1、腳標越界異常(IndexOutOfBoundsException)包括數組、字符串;
空指針異常(NullPointerException)
2、類型轉換異常:ClassCastException
3、沒有這個元素異常:NullPointerException
4、不支持操作異常;
異常要盡量避免,如果避免不了,需要預先給出處理方式。比如家庭備藥,比如滅火器。
-----------------------------------------------------------------------------------------------
包:定義包用package關鍵字。
1:對類文件進行分類管理。
2:給類文件提供多層名稱空間。
?
如果生成的包不在當前目錄下,需要最好執行classpath,將包所在父目錄定義到classpath變量中即可。
一般在定義包名時,因為包的出現是為了區分重名的類。所以包名要盡量唯一。怎么保證唯一性呢?可以使用url域名來進行包名稱的定義。
package pack;//定義了一個包,名稱為pack。 注意:包名的寫法規范:所有字母都小寫。
//package cn.itcast.pack.demo;
?
類的全名稱是 包名.類名
??? 編譯命令:javac –d 位置(.當前路徑) java源文件 (就可以自動生成包)
?
包是一種封裝形式,用于封裝類,想要被包以外的程序訪問,該類必須public;
類中的成員,如果被包以外訪問,也必須public;
?
包與包之間訪問可以使用的權限有兩種:
1:public
2:protected:只能是不同包中的子類可以使用的權限。
?
總結java中的四種權限:
??? 范圍?????? public? protected(保護)?? ??? default(默認)?????? private
同一個類中?????? ok???????????? ok????????????? ok????????? ??? ok
同一包中??????? ok???????????? ok????????????? ok?????
子類??????????? ok????????
不同包中???????? ok???????????? ok
-----------------------------------------------------------------------------------------------
Import - 導入:類名稱變長,寫起來很麻煩。為了簡化,使用了一個關鍵字:import,可以使用這個關鍵字導入指定包中的類。記住:實際開發時,到的哪個類就導入哪個類,不建議使用*.
import packa.*;//這個僅僅是導入了packa當前目錄下的所有的類。不包含子包。
import packa.abc.*;//導入了packa包中的子包abc下的當前的所有類。
?
如果導入的兩個包中存在著相同名稱的類。這時如果用到該類,必須在代碼中指定包名。
?
常見的軟件包:
java.lang : language java的核心包,Object System? String Throwable jdk1.2版本后,該包中的類自動被導入。
java.awt : 定義的都是用于java圖形界面開發的對象。
javax.swing: 提供所有的windows桌面應用程序包括的控件,比如:Frame , Dialog, Table, List 等等,就是java的圖形界面庫。
java.net : 用于java網絡編程方面的對象都在該包中。
java.io : input? output 用于操作設備上數據的對象都在該包中。比如:讀取硬盤數據,往硬盤寫入數據。
java.util : java的工具包,時間對象,集合框架。
java.applet: application+let 客戶端java小程序。server+let? -->? servlet 服務端java小程序。
?
jar :java的壓縮包,主要用于存儲類文件,或者配置文件等。
命令格式:jar –cf 包名.jar 包目錄
?? 解壓縮:jar –xvf 包名.jar
?將jar包目錄列表重定向到一個文件中:jar –tf 包名.jar >c:\1.txt
轉載于:https://www.cnblogs.com/cflhh/p/7846655.html
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的Java学习(三)面向对象异常的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用移动自适应布局+easy mock实
- 下一篇: 微信小程序现实问题之低素质客户需求问题