日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何以及何时使用例外

發布時間:2023/12/3 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何以及何时使用例外 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文是我們名為“ 高級Java ”的學院課程的一部分。

本課程旨在幫助您最有效地使用Java。 它討論了高級主題,包括對象創建,并發,序列化,反射等。 它將指導您完成Java掌握的過程! 在這里查看 !

目錄

1.簡介 2.異常以及何時使用它們 3.已檢查和未檢查的異常 4.使用嘗試資源 5.異常和lambda 6.標準Java異常 7.定義自己的例外 8.記錄例外 9.異常和記錄 10.下一步是什么 11.下載源代碼

1.簡介

Java中的異常是在程序流中發出異常(或異常)情況信號的重要工具,可能會阻止其進一步發展。 從本質上講,那些特殊情況可能是致命的(程序無法再運行,應該終止)或可恢復(程序可能會繼續運行,盡管某些功能可能不可用)。

在本教程的這一部分中,我們將逐步介紹在Java中使用異常的典型場景,討論已檢查和未檢查的異常,并探討一些極端情況和有用的習慣用法。

2.異常以及何時使用它們

簡而言之,異常是某種事件(或信號),它們在程序執行期間發生并中斷常規執行流程。 導致引入異常的想法是對過去使用的錯誤代碼和狀態檢查技術的替代。 從那時起,異常被廣泛接受為處理包括Java在內的許多編程語言中的錯誤情況的標準方法。

只有一個與異常處理相關的重要規則(不僅在Java中):永遠不要忽略它們! 每個異常都應至少記錄一次(請參閱Exceptions和logging ),但永遠不要忽略。 盡管如此,在某些罕見的情況下,可以安全地忽略異常,因為實際上可以做很多事情(請參閱示例中的使用try-with-resources部分)。

另外,在本教程的第6部分“ 如何有效地編寫方法”中 ,我們討論了參數驗證和健全性檢查。 異常是這些實踐的關鍵部分:每種公共方法都應在進行任何實際工作之前驗證所有必需的前提條件,如果某些條件未滿足,則提出適當的例外條件。

3.已檢查和未檢查的異常

Java語言中的異常管理與其他編程語言不同。 這主要是因為Java中有兩類異常: 選中的異常和未選中的異常。 有趣的是,這兩個類在某種程度上是人為的,是由Java語言規則及其編譯器強加的(但是JVM在它們之間沒有區別)。

根據經驗,未經檢查的異常用于表示與程序邏輯和所做假設有關的錯誤條件(無效參數,空指針,不支持的操作,等等)。 任何未經檢查的異常都是RuntimeException的子類,這就是Java編譯器如何理解特定異常屬于未經檢查的異常的類。

未經檢查的異常不需要被調用方捕獲,也不必被列為方法簽名的一部分(使用throws關鍵字)。 NullPointerException是未經檢查的異常的最著名的成員,這是Java標準庫中的聲明:

public class NullPointerException extends RuntimeException {public NullPointerException() {super();}public NullPointerException(String s) {super(s);} }

因此,檢查的異常表示程序無法直接控制的區域(如內存,網絡,文件系統等)中的無效條件。 任何檢查到的異常都是Exception的子類。 與未檢查的異常相反,已檢查的異常必須被調用者捕獲,或者被列為方法簽名的一部分(使用throws關鍵字)。 IOException可能是檢查異常中最知名的一種:

public class IOException extends Exception {public IOException() {super();}public IOException(String message) {super(message);}public IOException(String message, Throwable cause) {super(message, cause);}public IOException(Throwable cause) {super(cause);} }

在當時,將已檢查和未檢查的異常分開聽起來是個好主意,但是多年來,事實證明,它引入了更多樣板代碼,而不是解決實際問題的漂亮代碼模式。 Java生態系統中出現的典型(不幸的是,非常麻煩)模式是將未檢查的異常隱藏(或包裝)在未檢查的異常中,例如:

try {// Some I/O operation here } catch( final IOException ex ) {throw new RuntimeException( "I/O operation failed", ex ); }

這不是最好的選擇,但是如果精心設計自己的異常層次結構,可能會減少開發人員需要編寫的樣板代碼數量。

值得一提的是,Java中還有另一類異常擴展了Error類(例如, OutOfMemoryError或StackOverflowError )。 這些異常通常表明致命的執行失敗,導致無法立即從此類錯誤情況中恢復,從而導致程序立即終止。

4.使用嘗試資源

拋出的任何異常都會導致一些所謂的堆棧展開和程序執行流程的更改。 結果是與未封閉的本機資源(例如文件句柄和網絡套接字)有關的可能的資源泄漏。 Java中行為良好的典型I / O操作(直到版本7)需要使用強制性的finally塊來執行清理,并且通??雌饋硐襁@樣:

public void readFile( final File file ) {InputStream in = null;try {in = new FileInputStream( file );// Some implementation here} catch( IOException ex ) {// Some implementation here} finally {if( in != null ) {try {in.close();} catch( final IOException ex ) {/* do nothing */}}} }

盡管如此, finally塊看起來確實很丑陋(不幸的是,此處無法做太多事情,因為在輸入流上調用close方法也可能導致IOException異常),無論嘗試關閉輸入流(并釋放背后的操作系統資源)發生了什么情況它)將被執行。 在“ 異常以及何時使用它們 ”一節中,我們強調了一個事實,即永遠都不應忽略異常,但是,用close方法拋出的異??梢哉f是該規則的唯一排除項。

幸運的是,自Java 7以來,該語言引入了一種名為try-with-resources的新結構,該結構大大簡化了整體資源管理。 這是上面使用try-with-resources重寫的代碼片段:

public void readFile( final File file ) {try( InputStream in = new FileInputStream( file ) ) {// Some implementation here} catch( final IOException ex ) {// Some implementation here} }

為了在try-with-resources塊中使用該資源,唯一需要擁有的就是接口AutoCloseable 。 在后臺Java編譯器將此構造擴展為更復雜的結構,但對開發人員而言,代碼看起來非常易讀和簡潔。 請在適當的地方使用此非常方便的技術。

5.異常和lambda

在本教程的第3部分如何設計類和接口中 ,我們已經討論了Java 8的最新和最出色的功能,特別是lambda函數。 但是,我們尚未深入研究許多實際用例,并且例外是其中之一。

毫無疑問,未檢查的異??梢园搭A期工作,但是Java的lambda函數語法不允許指定可能拋出的已檢查的異常(除非這些異常由@FunctionalInterface本身定義)。 以下代碼段將不會以編譯錯誤“未處理的異常類型IOException”進行編譯(可能會在第03行拋出):

public void readFile() {run( () -> {Files.readAllBytes( new File( "some.txt" ).toPath() );} );}public void run( final Runnable runnable ) {runnable.run();}

現在唯一的解決方案是在lambda函數體內捕獲IOException異常,然后重新拋出適當的RuntimeException異常(不要忘記將原始異常作為原因傳遞),例如:

public void readFile() {run( () -> {try {Files.readAllBytes( new File( "some.txt" ).toPath() );} catch( final IOException ex ) {throw new RuntimeException( "Error reading file", ex );}} ); }

聲明了許多功能接口,可以從其實現中引發任何異常,但是如果沒有(如Runnable),則將檢查的異常包裝(或捕獲)為非檢查的異常是唯一的方法。

6.標準Java異常

Java標準庫提供了大量關于異常的類,這些異常類被指定為覆蓋程序執行期間發生的大多數通用錯誤。 下表列出了使用最廣泛的應用程序,請在定義您自己的應用程序之前考慮它們。

例外類別 目的
NullPointerException 在需要對象的情況下嘗試使用null 。
IllegalArgumentException 方法已傳遞了非法或不適當的參數。
IllegalStateException 方法已在非法或不適當的時間被調用。
IndexOutOfBoundsException 某種索引(例如,數組,字符串或向量)的索引超出范圍。
UnsupportedOperationException 不支持請求的操作。
ArrayIndexOutOfBoundsException 已使用非法索引訪問了數組。
ClassCastException 代碼已嘗試將對象強制轉換為不是實例的子類。
EnumConstantNotPresentException 試圖訪問一個enum的名稱和常量enum類型包含具有指定名稱的常量( enums一直在本教程中, 部分5 如何以及何時使用枚舉和注解 )。
NumberFormatException 嘗試將字符串轉換為數字類型之一,但是該字符串沒有適當的格式。
StringIndexOutOfBoundsException 索引為負或大于字符串的大小。
IOException 發生了某種I / O異常。 此類是由失敗或中斷的I / O操作產生的異常的一般類別。

表1 –標準Java異常

7.定義自己的例外

Java語言使定義自己的異常類非常容易。 精心設計的異常層次結構允許實施詳細且細粒度的錯誤條件管理和報告。 與往常一樣,找到合適的平衡非常重要:太多的異常類會使開發復雜化,并浪費大量的代碼來捕獲異?;驅惓鞑サ蕉褩V?。

強烈建議所有用戶定義的異常都應繼承自RuntimeException類,并屬于未經檢查的異常類(但是,規則中始終存在排除項)。 例如,讓我們定義異常以進行身份??驗證撥號:

public class NotAuthenticatedException extends RuntimeException {private static final long serialVersionUID = 2079235381336055509L;public NotAuthenticatedException() {super();}public NotAuthenticatedException( final String message ) {super( message );}public NotAuthenticatedException( final String message, final Throwable cause ) {super( message, cause );} }

此異常的目的是在信號插入過程中發出有關不存在或無效的用戶憑據的信號,例如:

public void signin( final String username, final String password ) {if( !exists( username, password ) ) {throw new NotAuthenticatedException("User / Password combination is not recognized" );} }

將信息性消息與異常一起傳遞始終是一個好主意,因為它有助于對生產系統進行故障排除。 同樣,如果異常是由于另一個特殊情況導致的,則應使用cause構造函數參數保留初始異常。 這將有助于找出問題的真正根源。

8.記錄例外

在本教程的第6部分“ 如何高效地編寫方法”中 ,我們介紹了Java方法的正確文檔。 在本節中,我們將花更多的時間討論如何使異常成為文檔的一部分。

如果方法作為其實現的一部分可能引發檢查的異常,則它必須成為方法簽名的一部分(使用throws聲明)。 Java文檔工具分別具有@throws標記,用于描述這些異常。 例如:

/*** Reads file from the file system.* @throws IOException if an I/O error occurs.*/ public void readFile() throws IOException {// Some implementation here }

相反,正如我們從Checked和unchecked異常一節中所知道的那樣,未經檢查的異常通常不聲明為方法簽名的一部分。 但是,記錄它們仍然是一個非常好的主意,因此方法的調用者將意識到可能引發的異常(使用相同的@throws標記)。 例如:

/*** Parses the string representation of some concept.* @param str String to parse* @throws IllegalArgumentException if the specified string cannot be parsed properly* @throws NullPointerException if the specified string is null*/ public void parse( final String str ) {// Some implementation here }

請始終記錄您的方法可能引發的異常。 它將幫助其他開發人員從一開始就實施適當的異常處理和恢復(后備)邏輯,從而避免他們對生產系統中的問題進行故障排除。

9.異常和記錄

日志記錄( http://en.wikipedia.org/wiki/Logfile )是或多或少復雜的Java應用程序,庫或框架的重要組成部分。 它是應用程序中發生的重要事件的日志,異常是此流程的關鍵部分。 在本教程的后面,我們可能會介紹Java標準庫提供的日志子系統,但是請記住,以后應該正確記錄和分析異常,以便發現應用程序中的問題并解決關鍵問題。

10.下一步是什么

在本教程的這一部分中,我們介紹了異常,這是Java語言的一個非常重要的功能。 我們已經看到異常是Java中錯誤管理的基礎。 異常使處理和發信號通知錯誤的情況變得非常容易,并且與錯誤代碼,標志和狀態相反,一旦發生,則不能忽略異常。 在下一部分中,我們將討論一個非常熱門和復雜的主題:Java中的并發和多線程編程。

11.下載源代碼

這是關于如何以及何時使用異常的課程。 您可以在此處下載源代碼: advanced-java-part-8

翻譯自: https://www.javacodegeeks.com/2015/09/how-and-when-to-use-exceptions.html

總結

以上是生活随笔為你收集整理的如何以及何时使用例外的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。