成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java? 教程(捕獲或指定要求)

wanglu1209 / 1069人閱讀

捕獲或指定要求

有效的Java編程語言代碼必須遵守捕獲或指定需求,這意味著可能拋出某些異常的代碼必須包含以下任一項:

捕獲異常的try語句,try必須為異常提供處理程序,如捕獲和處理異常中所述。

一種方法,指定它可以拋出異常,該方法必須提供一個throws子句,列出異常,如通過方法拋出指定異常中所述。

不符合捕獲或指定要求的代碼將無法編譯。

并非所有異常都受捕獲或指定要求的約束,為了理解原因,我們需要查看三個基本類別的異常,其中只有一個受要求限制。

三種異常

第一種異常是已檢查的異常,這些都是編寫良好的應(yīng)用程序應(yīng)該預(yù)料到并從中恢復(fù)的異常情況。例如,假設(shè)應(yīng)用程序提示用戶輸入文件名,然后通過將名稱傳遞給java.io.FileReader的構(gòu)造函數(shù)來打開該文件,通常,用戶提供現(xiàn)有可讀文件的名稱,因此FileReader構(gòu)造對象成功,并且應(yīng)用程序的執(zhí)行正常進行。但有時用戶提供不存在的文件的名稱,構(gòu)造函數(shù)拋出java.io.FileNotFoundException,一個編寫良好的程序?qū)⒉东@此異常并通知用戶該錯誤,可能提示更正的文件名。

已檢查的異常情況受捕獲或指定要求的約束,除ErrorRuntimeException及其子類表示的異常外,所有異常都是經(jīng)過檢查的異常。

第二種異常是錯誤,這些是應(yīng)用程序外部的異常情況,應(yīng)用程序通常無法預(yù)測或恢復(fù)。例如,假設(shè)應(yīng)用程序?qū)τ谳斎氤晒Υ蜷_文件,但由于硬件或系統(tǒng)故障而無法讀取文件,不成功的讀取將拋出java.io.IOError,應(yīng)用程序可能會選擇捕獲此異常,以便通知用戶該問題 — 但是程序打印堆棧跟蹤并退出也可能有意義。

錯誤不受捕獲或指定要求的約束,錯誤是Error及其子類表示的異常。

第三種異常是運行時異常,這些是應(yīng)用程序內(nèi)部的異常情況,應(yīng)用程序通常無法預(yù)測或恢復(fù),這些通常表示編程bug,例如邏輯錯誤或API的不當使用。例如,考慮前面描述的應(yīng)用程序?qū)⑽募麄鬟f給FileReader的構(gòu)造函數(shù),如果邏輯錯誤導(dǎo)致將null傳遞給構(gòu)造函數(shù),則構(gòu)造函數(shù)將拋出NullPointerException,應(yīng)用程序可以捕獲此異常,但消除導(dǎo)致異常發(fā)生的bug可能更有意義。

運行時異常不受捕獲或指定要求的約束,運行時異常是RuntimeException及其子類表示的異常。

錯誤和運行時異常統(tǒng)稱為未經(jīng)檢查的異常。

通過方法拋出指定異常

有時,代碼可以捕獲可能在其中發(fā)生的異常,但是,在其他情況下,最好讓調(diào)用堆棧中進一步的方法處理異常。例如,如果你將ListOfNumbers類作為類包的一部分提供,則可能無法預(yù)測包的所有用戶的需求,在這種情況下,最好不捕獲異常并允許調(diào)用堆棧進一步的方法來處理它。

如果writeList方法沒有捕獲可能在其中發(fā)生的已檢查異常,則writeList方法必須指定它可以拋出這些異常,讓我們修改原始的writeList方法來指定它可以拋出而不是捕獲它們的異常,這是不能編譯的writeList方法的原始版本。

public void writeList() {
    PrintWriter out = new PrintWriter(new FileWriter("OutFile.txt"));
    for (int i = 0; i < SIZE; i++) {
        out.println("Value at: " + i + " = " + list.get(i));
    }
    out.close();
}

要指定writeList可以拋出兩個異常,請將throws子句添加到writeList方法的方法聲明中,throws子句包含throws關(guān)鍵字,后跟逗號分隔的該方法拋出的所有異常列表,該子句在方法名稱和參數(shù)列表之后以及定義方法范圍的大括號之前,這是一個例子。

public void writeList() throws IOException, IndexOutOfBoundsException {

請記住,IndexOutOfBoundsException是未經(jīng)檢查的異常,在throws子句中包含它不是強制性的,你可以僅寫下面的內(nèi)容。

public void writeList() throws IOException {
繞過捕獲或指定

一些程序員認為捕獲或指定要求是異常機制中的一個嚴重缺陷,并通過使用未經(jīng)檢查的異常代替已檢查的異常來繞過它,通常,不建議這樣做,未經(jīng)檢查的異常 — 爭議部分討論何時適合使用未經(jīng)檢查的異常。

未經(jīng)檢查的異常 — 爭議

因為Java編程語言不需要捕獲或指定未經(jīng)檢查的異常的方法(RuntimeExceptionError及其子類),程序員可能會試圖編寫只拋出未經(jīng)檢查的異常的代碼,或者讓所有異常子類繼承自RuntimeException,這兩個快捷方式都允許程序員編寫代碼而不必擔心編譯器錯誤,也不必費心去指定或捕獲任何異常。雖然這對程序員來說似乎很方便,但它會回避catch的意圖或指定要求,并且可能會導(dǎo)致其他人使用你的類時出現(xiàn)問題。

為什么設(shè)計人員決定強制一個方法指定可以在其范圍內(nèi)拋出的所有未捕獲的已檢查異常?方法可以拋出的任何Exception都是該方法的公共編程接口的一部分,那些調(diào)用方法的人必須知道方法可以拋出的異常,以便他們可以決定如何處理它們,這些異常與該方法的編程接口一樣,也是其參數(shù)和返回值的一部分。

下一個問題可能是:“如果記錄方法的API非常好,包括它可以拋出的異常,為什么不指定運行時異常呢?”,運行時異常表示編程問題導(dǎo)致的問題,因此,無法合理地期望API客戶端代碼從它們恢復(fù)或以任何方式處理它們,這些問題包括算術(shù)異常,例如除以零;指針異常,例如嘗試通過空引用訪問對象;索引異常,例如嘗試通過索引太大或太小來訪問數(shù)組元素。

運行時異??梢栽诔绦蛑械娜魏蔚胤桨l(fā)生,而在典型的程序中,它們可以非常多,必須在每個方法聲明中添加運行時異常會降低程序的清晰度,因此,編譯器不要求你捕獲或指定運行時異常(盡管你可以)。

拋出RuntimeException的常見做法之一是用戶錯誤地調(diào)用方法,例如,方法可以檢查其中一個參數(shù)是否錯誤地為null,如果參數(shù)為null,則該方法可能會拋出NullPointerException,這是一個未經(jīng)檢查的異常。

一般來說,不要因為你不希望指定方法可以拋出的異常而煩惱而拋出RuntimeException或創(chuàng)建RuntimeException的子類。

這是底線指南:如果可以合理地期望客戶端從異常中恢復(fù),則將其作為已檢查的異常,如果客戶端無法執(zhí)行任何操作以從異常中恢復(fù),請將其設(shè)置為未經(jīng)檢查的異常。

上一篇:什么是異常? 下一篇:捕獲和處理異常

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/74024.html

相關(guān)文章

  • Java? 教程(目錄)

    Java? 教程 Java教程是為JDK 8編寫的,本頁面中描述的示例和實踐沒有利用在后續(xù)版本中引入的改進。 Java教程是希望使用Java編程語言創(chuàng)建應(yīng)用程序的程序員的實用指南,其中包括數(shù)百個完整的工作示例和數(shù)十個課程,相關(guān)課程組被組織成教程。 覆蓋基礎(chǔ)知識的路徑 這些教程以書籍的形式提供,如Java教程,第六版,前往Amazon.com購買。 入門 介紹Java技術(shù)和安裝Java開發(fā)軟件并使用...

    lifesimple 評論0 收藏0
  • Java? 教程(什么是異常?)

    什么是異常? exception一詞是exceptional event這一短語的簡寫。 定義:異常是在程序執(zhí)行期間發(fā)生的事件,它會破壞程序指令的正常流程。 當方法中發(fā)生錯誤時,該方法會創(chuàng)建一個對象并將其交給運行時系統(tǒng),該對象稱為異常對象,包含有關(guān)錯誤的信息,包括錯誤發(fā)生時的類型和程序狀態(tài),創(chuàng)建異常對象并將其交給運行時系統(tǒng)稱為拋出異常。 在方法拋出異常后,運行時系統(tǒng)會嘗試查找處理它的內(nèi)容,處理異常...

    Enlightenment 評論0 收藏0
  • Java? 教程捕獲和處理異常)

    捕獲和處理異常 本節(jié)描述如何使用三個異常處理程序組件 — try、catch和finally塊 — 來編寫異常處理程序,然后,解釋了Java SE 7中引入的try-with-resources語句,try-with-resources語句特別適用于使用Closeable資源的情況,例如流。 本節(jié)的最后一部分將介紹一個示例,并分析各種場景中發(fā)生的情況。 以下示例定義并實現(xiàn)名為ListOfNumbe...

    Yujiaao 評論0 收藏0
  • Java? 教程(Thread對象)

    Thread對象 每個線程都與Thread類的實例相關(guān)聯(lián),使用Thread對象創(chuàng)建并發(fā)應(yīng)用程序有兩種基本策略。 要直接控制線程的創(chuàng)建和管理,只需在每次應(yīng)用程序需要啟動異步任務(wù)時實例化Thread。 要從應(yīng)用程序的其余部分抽象線程管理,請將應(yīng)用程序的任務(wù)傳遞給執(zhí)行器。 本節(jié)介紹Thread對象的使用,Executors將與其他高級并發(fā)對象一起討論。 定義和啟動線程 創(chuàng)建Thread實例的應(yīng)用程序...

    you_De 評論0 收藏0
  • Java? 教程(如何拋出異常)

    如何拋出異常 在捕獲異常之前,某些代碼必須拋出一個,任何代碼都可能拋出異常:你的代碼,來自其他人編寫的包中的代碼,例如Java平臺附帶的包或Java運行時環(huán)境,無論拋出什么異常,它總是使用throw語句拋出。 你可能已經(jīng)注意到,Java平臺提供了許多異常類,所有類都是Throwable類的后代,并且所有類都允許程序區(qū)分在程序執(zhí)行期間可能發(fā)生的各種類型的異常。 你還可以創(chuàng)建自己的異常類來表示你編寫的...

    zhangwang 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<