day19-Java異常處理/File類

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

  • A:異常的概述:異常就是Java程序在運行過程中出現(xiàn)的錯誤餐塘。
  • B:異常的分類
    • 通過API查看Throwable類周崭,Throwable 類是 Java 語言中所有錯誤或異常的超類苞也。有2個子類:Error璃氢、Exception.
  • 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,finallyfinalize的區(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)注和點贊哦异袄。
非要打賞的話,我也是不會拒絕的玛臂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末烤蜕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子迹冤,更是在濱河造成了極大的恐慌讽营,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泡徙,死亡現(xiàn)場離奇詭異橱鹏,居然都是意外死亡,警方通過查閱死者的電腦和手機堪藐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門莉兰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人礁竞,你說我怎么就攤上這事糖荒。” “怎么了模捂?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵捶朵,是天一觀的道長。 經(jīng)常有香客問我狂男,道長综看,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任岖食,我火速辦了婚禮寓搬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘县耽。我一直安慰自己句喷,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布兔毙。 她就那樣靜靜地躺著唾琼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪澎剥。 梳的紋絲不亂的頭發(fā)上锡溯,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機與錄音,去河邊找鬼祭饭。 笑死芜茵,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的倡蝙。 我是一名探鬼主播九串,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼寺鸥!你這毒婦竟也來了猪钮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤胆建,失蹤者是張志新(化名)和其女友劉穎烤低,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笆载,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡扑馁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了凉驻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片檐蚜。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖沿侈,靈堂內(nèi)的尸體忽然破棺而出闯第,到底是詐尸還是另有隱情,我是刑警寧澤缀拭,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布咳短,位于F島的核電站,受9級特大地震影響蛛淋,放射性物質(zhì)發(fā)生泄漏咙好。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一褐荷、第九天 我趴在偏房一處隱蔽的房頂上張望勾效。 院中可真熱鬧,春花似錦叛甫、人聲如沸饭望。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至旨椒,卻和暖如春邦危,著一層夾襖步出監(jiān)牢的瞬間毯侦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工米死, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贮庞。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓峦筒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親窗慎。 傳聞我的和親對象是個殘疾皇子物喷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法捉邢,內(nèi)部類的語法脯丝,繼承相關(guān)的語法商膊,異常的語法伏伐,線程的語...
    子非魚_t_閱讀 31,632評論 18 399
  • 一:java概述:1,JDK:Java Development Kit晕拆,java的開發(fā)和運行環(huán)境藐翎,java的開發(fā)工...
    ZaneInTheSun閱讀 2,651評論 0 11
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)实幕,斷路器吝镣,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 一、多態(tài) 1. 概述 理解:多態(tài)可以理解為事物存在的多種體(表)現(xiàn)形態(tài)表蝙。例如:動物中的貓和狗拴测。貓這個對象對應(yīng)的是貓...
    陳凱冰閱讀 339評論 0 1
  • 日復(fù)一日的生活如同反復(fù)咀嚼的口香糖,再香甜的口感在循環(huán)往復(fù)中都被消磨殆盡府蛇,無味集索,便逐漸無感,人也變得麻木遲鈍起來汇跨,...
    火火閑拾Moment閱讀 497評論 0 1