19.01_異常(異常的概述和分類)
- A:異常的概述:異常就是Java程序在運行過程中出現(xiàn)的錯誤餐塘。
- B:異常的分類
- 通過API查看
Throwable
類周崭,Throwable
類是 Java 語言中所有錯誤或異常的超類苞也。有2個子類:Error
璃氢、Exception
.
- 通過API查看
- C:異常的繼承體系
-Throwable
-Error
-Exception
-RuntimeException (這個異常班眯,一般是由程序員犯的錯誤引起的)
19.02_JVM默認是如何處理異常的
- main函數(shù)收到這個問題時,有兩種處理方式:
- a:自己將該問題處理,然后繼續(xù)運行
- b:自己沒有針對的處理方式,只有交給調(diào)用main的jvm來處理
- jvm有一個默認的異常處理機制,就將該異常進行處理.
- 并將該異常的名稱,異常的信息.異常出現(xiàn)的位置打印在了控制臺上,同時將程序停止運行
19.03_異常(try...catch的方式處理異常1)
try
:用來檢測異常
catch
:用來捕獲異常
finally
:釋放資源
三種搭配方式
try catch
try catch finally
try finally
19.04_異常(try...catch的方式處理異常2)
try {
....
} catch (ArithmeticException e) {
....
} catch (Exception e) {
....
}
try后面如果跟多個catch丈秩,那么小的異常放前面盯捌,大的異常放后面,根據(jù)多態(tài)原理蘑秽,如果大的放前面饺著,就會將所有的子類對象異常接收箫攀,后面的catch就沒有意義了。
JDK7新增異常處理方法:
try {
....
} catch (ArithmeticException | ArrayStoreException e) {
這里可以同時處理 多個類型的異常
}
19.05_編譯期異常和運行期異常的區(qū)別
Java中的異常被分為兩大類:編譯時異常和運行時異常幼衰。
所有的
RuntimeException
類及其子類的實例被稱為運行時異常靴跛,其他的異常就是編譯時異常-
編譯時異常
- Java程序必須顯示處理,否則程序就會發(fā)生錯誤渡嚣,無法通過編譯
-
運行時異常
- 無需顯示處理梢睛,也可以和編譯時異常一樣處理
19.06_Throwable的幾個常見方法
Throwable
的幾個常見方法
try {
System.out.println(10 / 0);
} catch (Exception e) {
System.out.println(e.getMessage()); // 獲取異常信息,返回字符串识椰。
System.out.println(e.toString()); // 獲取異常類名和異常信息绝葡,返回字符串
e.printStackTrace(); //JVM默認就使用這種方式處理異常
}
19.07_throws的方式處理異常
-
throws
的方式處理異常- 定義功能方法時,需要把出現(xiàn)的問題暴露出來讓調(diào)用者去處理腹鹉。
- 那么就通過
throws
在方法上標識藏畅。
public static void setAge(int age) throws Exception {
if (age > 0 && age <= 150) {
System.out.println("年齡是: " + age);
} else {
throw new Exception("年齡非法"); //注意這里的異常類型
}
}
拋出異常情況:
編譯時異常: 必須對其進行處理。
運行時異常: 可以處理也可以不處理功咒。
19.08_throw的概述以及和throws的區(qū)別
- A:throw的概述
- 在功能方法內(nèi)部出現(xiàn)某種情況愉阎,程序不能繼續(xù)運行,需要進行跳轉(zhuǎn)時力奋,就用throw把異常對象拋出榜旦。
throws和throw的區(qū)別
- a:
throws
- 用在方法聲明后面,跟的是異常類名
- 可以跟多個異常類名景殷,用逗號隔開
- 表示拋出異常章办,由該方法的調(diào)用者來處理
- b:
throw
- 用在方法體內(nèi),跟的是異常對象名
- 只能拋出一個異常對象名
- 表示拋出異常滨彻,由方法體內(nèi)的語句處理
19.09_finally關(guān)鍵字的特點及作用
- A:finally的特點
- 被
finally
控制的語句體一定會執(zhí)行藕届,就算catch
里面有return
,也會被執(zhí)行亭饵。 - 特殊情況:在執(zhí)行到
finally
之前jvm退出了(比如System.exit(0)
)
- 被
- B:
finally
的作用- 用于釋放資源休偶,在IO流操作和數(shù)據(jù)庫操作中會見到
19.10_異常(finally關(guān)鍵字的面試題)
-
final
,finally
和finalize
的區(qū)別
final 可以修飾類,類就不能被繼承
修飾方法辜羊,方法不能被重寫
修飾變量踏兜,變量只能賦值一次
finally 是try語句中的一個語句體,不能單獨使用八秃,用來釋放資源
finalize() 是一個方法:
當(dāng)垃圾回收器確定不存在對該對象的更多引用時碱妆,由對象的垃圾回收器調(diào)用此方法。
- 如果
catch
里面有return
語句昔驱,請問finally
的代碼還會執(zhí)行嗎?如果會疹尾,請問是在return
前還是return
后?
答: 執(zhí)行,return前
public int method() {
int x = 10;
try {
x = 20;
System.out.println( 12/0 );
return x;
} catch (Exception e){
x = 30 ;
return x;
} finally { //順便提一句:千萬不要在finally里寫return語句,這里僅僅做釋放語句
x = 40 ;
}
}
// 請問上述程序纳本,返回多少窍蓝? (答案是30,因為return關(guān)鍵字執(zhí)行時繁成,就把返回值返回了吓笙,再執(zhí)行
finally時,僅僅是把x值改變了巾腕,但是30已經(jīng)被返回了)
19.11_自定義異常概述和基本使用
- A:為什么需要自定義異常 : 為了見名知意面睛。
- B:自定義異常概述
- 繼承自
Exception
- 繼承自
RuntimeException
然后再重寫構(gòu)造方法即可。
- 繼承自
19.12_異常的注意事項及如何使用異常處理
- A:異常注意事項
- a:子類重寫父類方法時尊搬,子類的方法必須拋出相同的異澄甏或父類異常的子類。(父親壞了,兒子不能比父親更壞)
- b:如果父類拋出了多個異常,子類重寫父類時,只能拋出相同的異郴汆拢或者是他的子集,子類不能拋出父類沒有的異常
- c:如果被重寫的方法沒有異常拋出,那么子類的方法絕對不可以拋出異常,如果子類方法內(nèi)有異常發(fā)生,那么子類只能try,不能throws
- B:如何使用異常處理
原則:如果該功能內(nèi)部可以將問題處理,用try,如果處理不了,交由調(diào)用者處理,這是用throws
-
區(qū)別:
- 后續(xù)程序需要繼續(xù)運行就try
- 后續(xù)程序不需要繼續(xù)運行就throws
如果JDK沒有提供對應(yīng)的異常亲茅,需要自定義異常。
19.13_異常(練習(xí))
- 鍵盤錄入一個int類型的整數(shù),對其求二進制表現(xiàn)形式
Scanner sc = new Scanner(System.in);
System.out.println("請輸入一個整數(shù):");
while (true) {
String str = sc.nextLine();
try {
int num = Integer.parseInt(str);
System.out.println("二進制是: " + Integer.toBinaryString(num));
break ;
} catch (Exception e1) {
try {
new BigInteger(str); //如果錄入是一個很大的整數(shù)狗准,這句就不會報錯
System.out.println("錄入整數(shù)過大...請重新錄入...");
} catch (Exception e2) {
try {
new BigDecimal(str); //如果錄入是小數(shù)克锣,這句就不會報錯
System.out.println("錄入的是小數(shù)...請重新錄入...");
} catch (Exception e) {
System.out.println("錄入的不是整數(shù)...請重新錄入...");
}
}
}
}
sc.close();
19.14_File類的概述和構(gòu)造方法
-
File更應(yīng)該叫做一個路徑
- 文件路徑或者文件夾路徑
- 路徑分為絕對路徑和相對路徑
- 絕對路徑是一個固定的路徑,從盤符開始
- 相對路徑相對于某個位置,在eclipse下是指當(dāng)前項目下,在dos下
- 查看API指的是當(dāng)前路徑
- 文件和目錄路徑名的抽象表示形式
B:構(gòu)造方法
File(String pathname):根據(jù)一個路徑得到File對象
File(String parent, String child):根據(jù)一個目錄和一個子文件/目錄得到File對象
File(File parent, String child):根據(jù)一個父File對象和一個子文件/目錄得到File對象
19.15_File類的創(chuàng)建功能
File file = new File("xxoo.txt");
System.out.println(file.createNewFile()); //創(chuàng)建文件
File f2 = new File("XXOO");
System.out.println(f2.mkdir()); //創(chuàng)建文件夾
File f3 = new File("PP//WW"); //這里寫成 \\ 或者 / 或者 // 都是可以的
System.out.println(f3.mkdirs()); //創(chuàng)建多級文件夾
如果你創(chuàng)建文件或者文件夾忘了寫盤符路徑,那么腔长,默認在項目路徑下
以上都是如果存在袭祟,就不創(chuàng)建了。
19.16_File類的重命名和刪除功能
public boolean renameTo(File dest):把文件重命名為指定的文件路徑
public boolean delete():刪除文件或者文件夾
重命名注意事項
-如果路徑名相同捞附,就是改名巾乳。
-如果路徑名不同,就是改名并剪切鸟召。
刪除注意事項:
-Java中的刪除不走回收站胆绊。
-要刪除一個文件夾,請注意該文件夾內(nèi)不能包含文件或者文件夾
19.17_File類的判斷功能
public boolean isDirectory() :判斷是否是目錄
public boolean isFile() :判斷是否是文件
public boolean exists() :判斷是否存在
public boolean canRead() :判斷是否可讀
public boolean canWrite() :判斷是否可寫
public boolean isHidden() :判斷是否隱藏
public boolean setReadable(boolean readable) //設(shè)置是否可讀
public boolean setWritable(boolean writable) //設(shè)置是否可寫
注意在 Windows系統(tǒng)下欧募,一切文件都是可讀的压状。所以win下設(shè)置是否可讀無效。
19.18_File類的獲取功能
public String getAbsolutePath():獲取絕對路徑
public String getPath():獲取路徑
public String getName():獲取名稱
public long length():獲取長度跟继。字節(jié)數(shù)
public long lastModified():獲取最后一次的修改時間种冬,毫秒值
public String[] list():獲取指定目錄下的所有文件或者文件夾的名稱數(shù)組
public File[] listFiles():獲取指定目錄下的所有文件或者文件夾的File數(shù)組
File file = new File("xxoo.txt");
Date d = new Date(file.lastModified()); //最后一次修改時間,毫秒值
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(df.format(d));
19.19_輸出指定目錄下指定后綴的文件名
- 需求:判斷E盤目錄下是否有后綴名為.jpg的文件舔糖,如果有娱两,就輸出該文件名稱
File[] files = new File("E:\\QQVipDownload").listFiles();
for (File f : files) {
if (f.isFile() && f.getName().endsWith(".exe")) {
System.out.println(f);
}
}
19.20_文件名稱過濾器的概述及使用
public String[] list(FilenameFilter filter)
public File[] listFiles(FileFilter filter)
需求:判斷E盤目錄下是否有后綴名為.jpg的文件,如果有金吗,就輸出該文件名稱
File f2 = new File("E:\\QQVipDownload");
File[] arr = f2.listFiles(new FilenameFilter() { //文件名稱過濾器
@Override
public boolean accept(File dir, String name) {
File f = new File(dir, name);
return (f.isFile() && f.getName().endsWith(".exe"));
}
});
for (File file : arr) {
System.out.println(file);
}
最好看看源碼: 帶文件名稱過濾器的list()方法的源碼
END十兢。
我是小侯爺趣竣。
在魔都艱苦奮斗,白天是上班族纪挎,晚上是知識服務(wù)工作者。
如果讀完覺得有收獲的話跟匆,記得關(guān)注和點贊哦异袄。
非要打賞的話,我也是不會拒絕的玛臂。