------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! -------
一、異常
A:概述
異常:程序在運行過程中發生由於硬件設備問題、軟件設計錯誤等導致的程序異常事件。說白了,就是程 序的非正常情況。
在Java等面向對象的編程語言中,異常本身是一個類,產生異常就是產生了一個異常對象。
B:繼承體系結構
C:分類
嚴重錯誤:無法通過處理的錯誤。
運行時異常:運行時可能會報錯,可以不處理。如數學異常。
編譯時異常:編譯時無法編譯通過。如日期格式化異常
D:異常處理
jvm的默認處理方式:
默認情況下,jvm會採用默認處理方案:
把異常的全路徑名稱,原因,及位置等信息顯示出來。
注意:
如果是jvm的默認處理方式,那麼,它會在出問題的地方結束。
異常處理步驟:
1、創建異常對象(JDK已定義的異常會自動創建對象,自定義異常需要手動創建)
2、拋出異常(JDK已有定義的異常會自動過拋出異常,自定義異常需手動拋出)
3、處理異常
將異常捕獲並處理
try...catch...finally
基本格式:
try {
可能有問題的代碼;
}catch(異常對象) {
對問題的處理;
}finally {
釋放資源;
}
變形格式:
try...catch
try...catch...catch
try...catch...catch...finally
try...finally
多異常捕獲處理:
分別捕獲分別處理,每個try對應一個catch
集中捕獲分別處理,一個try對應所有catch
注意:大的異常不能在前邊捕獲
一次捕獲共同處理
注意:不能同時捕獲大的異常與小的異常
聲明拋出異常與拋出異常
throws:用於聲明函數拋出異常。用於函數聲明。是異常對象的處理方式之一。
多個異常可以同時聲明拋出,用逗號分隔。
throw:用於拋出異常對象。用於函數內容。
當出現JDK異常對象時,JVM會自動創建一個異常對象並拋出。
自定義異常對象可以先創建異常對象,再使用throw拋出。拋出後再進行處理:或使用捕獲或使用聲明拋 出。
自定義異常
如果涉及其他需求,JDK沒有提供相應的異常對象,則可以自己定義異常。
定義格式:繼承Exception或者RuntimeException。同時需要帶參的構造方法,用於接收異常信息。
class MyException{
public MyException(String message){
super(message);
}
}
異常常見方法
重寫了toString方法
public String getMessage()
public void printStackTrace()
public void printStackTrace(PrintStream s)
異常處理注意細節
如果多個異常,有子父關係,父異常一定要放在最後。
如果多個異常,是平級關係,它們存在的位置沒有順序關係。
執行順序:
在try裏面的代碼會按照從上往下執行,一旦發生問題,
就會產生一個異常對象,去和catch裏面進行匹配。
有對應的匹配,就走對應的處理方案。
沒有,就找父匹配,有就走對應的處理方案。
如果找不到,那麼就由jvm採用默認處理方案。
JDK7的新特性:在處理多個平級的異常的時候
catch(ExceptionA | ExceptionB | ExceptionC ... e) {
}
E:面試題:
A:Exception和RuntimeException的區別?
Exception:分爲編譯期異常和運行期異常。編譯期異常是必須處理的。否則,代碼不能編譯通過。
RuntimeException:運行期異常,不需要編寫異常處理代碼,但是可能需要修正程序參數或者邏輯代碼。
B:throws和throw的區別?
throws:在方法聲明上,後面跟的是異常類名。
throws聲明後面如果是一個運行時期異常,調用者不需要處理。這種方式沒有意義。
throws聲明後面跟的是一個編譯期異常,調用者是必須處理的。
throw:在方法體中,後面跟的是異常對象名。
throw後面如果拋出的是運行時期異常對象,那麼方法上是不需要進行聲明的。
throw後面如果拋出的是編譯時期異常對象,那麼,一般在方法聲明上都是要用throws聲明該方法有 異常。
C:finally的面試題
a:final,finally,finalize的特點及區別?
b:如果catch裏面有return,請問finally裏面的代碼還執行嗎?
如果執行,是在return前,還是後呢?
c:寫一個程序,測試finally裏面的操作對結果沒有影響。
finally一般只用於釋放資源。
D:jvm的默認處理方式?
F:怎麼選擇
A:能夠自己處理的時候,儘量自己處理。
B:在main方法裏面儘量不要拋。
C:將來在實際開發中,我們會把不同的異常給出不同的界面進行顯示給用戶。
G:子父關係中的異常處理
class Fu {
public void show() throws Exception{
}
}
class Zi extends Fu {
public void show() throws RuntimeException{
}
}
class Demo {
public static void main(String[] args) {
}
}
子的重寫方法中不能拋出比父更大的異常。
二、File
(1)File概述:
將文件路徑或者文件夾路徑封裝成的類。實際代表該路徑下的文件或者文件夾。方便對文件與文件夾的屬性信息進行 操作。
(2)理解
因爲硬盤上對數據的存儲基本上都是以文件存在。爲了方便對文件或者文件夾進行操作。java就提供了一個類File
供我們使用。本質上是對路徑的封裝。
(3)File類構造方法:
A:File file = new File("d:\\a.txt");
B:File file = new File("d:\\","a.txt");
C:File file = new File("d:");
File file2 = new File(file,"a.txt");
以上三種格式等價。
(4)File類的功能:
A:創建功能
創建文件:createNewFile()
創建文件夾:mkdir(),mkdirs()
注意:僅僅根據後綴名並不能判斷是文件還是文件夾。
B:刪除功能
刪除文件或者文件夾:
delete()
注意:
A:刪除一個帶內容的目錄,必須先刪除內容,在刪除目錄。
B:java中的刪除不走回收站。
C:判斷功能
判斷file是否存在:exists()
判斷file是否是文件:isFile()
判斷file是否是文件夾:isDirectory()
D:重名名功能
把舊名稱改變爲新名稱:renameTo()
注意:路徑問題。
重命名涉及兩個File對象。
將File1重命名成File2
在同一目錄下:
file2文件已經存在,重命名失敗
file2文件不存在,重命名成功
在不同目錄下:
file2文件已經存在,重命名失敗
file2文件不存在,剪切成功
E:獲取功能
基本獲取
獲取絕對路徑:getAbsolutePath()
獲取定義的路徑:getPath()
獲取名稱:getName()
獲取大小:length()
獲取最後修改時間:lastModified()
高級獲取
獲取指定目錄下所有文件或者文件夾的名稱數組:list()
獲取指定目錄下所有文件或者文件夾的File數組:listFiles()
返回所有盤符:listRoots()
文件過濾器:
接口 FilenameFilter 重寫accept()方法
dir:文件所在的目錄 name:文件名稱
方式1,定義類實現FilenameFilter,list(這個類的實例對象)
方式2,匿名內部類
注意:File對象可以作爲參數傳遞給流的構造函數。
三、遞歸
(1)在函數內調用函數本身,即方法定義中調用方法本身的現象。
(2)遞歸注意事項:
A:要有出口,否則就是死遞歸。
B:次數不能太多,否則內存溢出。
特殊事項:構造方法不能遞歸定義。
(3)案例:(面試可能見到)
A:遞歸求階乘
B:遞歸求兔子問題(斐波那契數列)
C:遞歸遍歷目錄(帶內容的目錄)
D:遞歸刪除目錄(帶內容的目錄)
(4)遞歸注意事項:
必須在函數內調用該函數本身。
遞歸算法所在函數內,必須有函數出口。
遞歸次數不能過多,否則會導致內存溢出。
------<a
href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! -------