Java中已檢查和未檢查的異常

Java有兩種類型的異常-已檢查和未檢查。 簡而言之,選中的是指開發人員可以從異常中合理恢復的情況,而未選中的異常是無法處理的編程錯誤。 本文介紹了何時使用哪種。

但這不是那么簡單–受檢查的異常使代碼變得“丑陋”。 它們迫使開發人員編寫try / catch塊或重新拋出異常。 但是重新拋出隱藏了另一個問題–一些異常不應跨越模塊邊界。 當您不知道要做什么時,被迫捕獲一個已檢查的異常時,最常見的做法是將其包裝在RuntimeException中并重新拋出。

實際上,這可能不是最常見的-尤其是新手程序員傾向于吞下帶有空catch塊的異常。 如果存在一些用于異常處理的常規層,則日志和重新拋出有時會導致堆棧跟蹤加倍。 無論如何,這里有多種不良做法,導致難以調試和維護的代碼。

有人說,鑒于檢查過的異常所帶來的冗長,繁瑣和容易出錯,應該徹底消除它們。 C#根本沒有檢查過的異常。 當然,消除它們應該考慮向后兼容性。

但是,我認為擁有這兩種例外的決定具有其優點。 它迫使開發人員認為在這種情況下可能會發生異常,因此他必須采取措施。 API聲明它將拋出異常,并且開發人員將看到此編譯時 。 它增強了編譯時的安全性。 您不應該等到代碼投入生產后才發現可能會失敗。 Javadoc? 好吧,這是一個不錯的選擇,但是我敢打賭,直到異常發生之前,沒有人會閱讀javadoc。

那么,如何擁有“兩全其美”呢? 我有一個奇怪的想法( 請在此處詳細說明 ),使API定義兩個接口(通過繼承鏈接,因此實際上僅支持一個接口),并提供一種通過工廠獲得方法的方法,該實現的方法被檢查異常,或將檢查的異常包裝為未檢查的異常。 我不知道這可能是可行的,也可能是愚蠢的。 現在,它看起來很奇怪。

但是以上只是一個解決方法。 然后另一個想法來了–在方法上引入@RethrowExceptions批注。 它會告訴編譯器,在此方法中,您不想處理已檢查的異常,但也不想聲明將其拋出。 (注釋的名稱可以改進)。 在我想到的最簡單的實現中,這可以簡單地告訴編譯器使用try {..} catch (Exception ex) { throw new RuntimeException(ex);}包圍整個方法主體。 好處:

  • 編譯器仍然警告您使用的方法可能會引發異常,因此您必須考慮處理它
  • 通過不必要的嘗試/捕獲,您不會使代碼變得丑陋。 而且您不會強迫呼叫者考慮如何處理例外情況
  • 吞下異常的可能性降低了。

簡而言之,這樣的注釋會將方法標記為無法處理異常并且不希望將此決定傳播給調用者的方法。

這個想法聽起來不那么奇怪。 我猜它現在甚至可以使用編譯器插件來實現。 還是已經在lombok項目中實現了?

別忘了分享!

參考: Bozho的技術博客博客中的JCG合作伙伴 Bozhidar Bozhanov提供的 Java中的Checked和Unchecked異常 。


翻譯自: https://www.javacodegeeks.com/2012/09/checked-and-unchecked-exceptions-in-java.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371195.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371195.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371195.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CCF - 201403-3 - 命令行選項

問題描述 試題編號:201403-3試題名稱:命令行選項時間限制:1.0s內存限制:256.0MB問題描述: 問題描述請你寫一個命令行分析程序,用以分析給定的命令行里包含哪些選項。每個命令行由若干個字符串組成,它們之間恰好由一個空…

java 枚舉 values_JAVA 枚舉運用一 values方法

importjava.lang.reflect.Method;importjava.lang.reflect.Type;importjava.util.Set;import java.util.*;public classEnumJavaClass {public enumEnumClass{One("參數變量枚舉一"),Two("參數變量枚舉二"),Three("參數變量枚舉三");privateStri…

telnet測試端口是否正常打開

點擊計算機的開始菜單--》運行 ,輸入CMD命令,然后確定。打開cmd命令行。 輸入telnet測試端口命令: telnet IP 端口 或者 telnet 域名 端口 回車 如果端口關閉或者無法連接,則顯示不能打開到主機的鏈接,鏈接失敗 端口…

Linux歷史,安裝,分區,版本

Linux 歷史 1970年是 UNIX元年,這一年 Kenneth Lane Thompson 和 Dennis Ritchie 合作編寫了UNIX系統。Stallman 發起了GNU 計劃,他本人開發了Emacs, GCC, GDB.Minix:教學用的類UNIX系統,由于UNIX是收費的且價格昂貴,因…

放棄Eclipse Juno

在上一個博客中,我發布了有關Eclipse 4.2 Juno設置的信息。 萬一我需要重新安裝其他東西,也可以作為參考。 當時我沒有談論的是我與Juno共同遇到的問題。 我以為這是我自己的安裝程序,很麻煩,但是此后并沒有太大改善。 我遇到的主…

Java instead of 用法_我又不是你的誰--java instanceof操作符用法揭秘

背景故事《曾經最美》是朱銘捷演唱的一首歌曲,由陳佳明填詞,葉良俊譜曲,是電視劇《水晶之戀》的主題曲。歌曲時長4分28秒。 歌曲歌詞:看不穿你的眼睛藏有多少悲和喜像冰雪細膩又如此透明仿佛片刻就要老去整個城市的孤寂不止一個你…

3.26

http://codeforces.com/gym/101196/attachments A題 B題 題意:一群人玩桌上足球(>4人),分成黑白兩隊,每隊有進攻和防守兩名玩家,如果有一方失敗則失敗方的防守坐到等候席的結尾、進攻被流放到防守區再上來一個人作為進攻方。而…

scala akka通信機制

https://www.2cto.com/kf/201701/587514.html轉載于:https://www.cnblogs.com/rocky-AGE-24/p/7542874.html

JUnit通過失敗測試案例

為什么要建立一種預期測試失敗的機制? 有一段時間,人們會希望并期望JUnit Test案例失敗。 盡管這種情況很少見,但確實發生了。 我需要檢測JUnit測試何時失敗,然后(如果期望的話)通過而不是失敗。 具體情況是…

CentOS6.5安裝MySQL5.7詳細教程

CentOS6.5安裝MySQL5.7詳細教程 注:文中所寫的安裝過程均在CentOS6.5 x86下通過測試 主要參考博文: https://segmentfault.com/a/1190000003049498 http://www.th7.cn/db/mysql/201601/175073.shtml 1.檢測系統是否已經安裝過mysql或其依賴,若…

cmake 查看編譯命令,以及在vscode中如何使用cmke

通過設置如下配置選項,可以生成compile_commands.json 文件,記錄使用的編譯命令 set(CMAKE_EXPORT_COMPILE_COMMANDS ON)獲得現有模塊列表 cmake --help-module-list查看命令文檔 cmake --help-command find_file查看模塊的詳細信息 cmake --help-mo…

php學習八:封裝

一:在php中,用class關鍵字來創建一個類,即進行封裝;在類里面有成員屬性和方法行為組成: 1.成員屬性:用關鍵字var來聲明,可以給初始值也可以不給;現在var廢棄,用public來聲明,public為共有屬性&a…

純Java JavaFX 2.0菜單

在有關JavaFX的最新文章中 ,我集中討論了不使用JavaFX 1.x的JavaFXScript和不使用JavaFX 2.0的新FXML來使用JavaFX 2.0的新Java API 。 所有這些示例均已使用標準Java編譯器進行了編譯,并使用標準Java啟動 器執行。 在本文中,我將繼續演示使用…

設置QtreeWidget水平滾動條

轉載請注明出處:http://www.cnblogs.com/dachen408/p/7552603.html //設置treewidget水平滾動條 ui.treeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents);ui.treeWidget->header()->setStretchLastSection(false);轉載于:https…

java 序列化 uid,Java中的序列化版本uid

How is Serialization id stored in the instance of the object ?The Serialization id we declare in Java is static field;and static fields are not serialized.There should be some way to store the static final field then. How does java do it ?解決方案The ser…

HTML5本地存儲

什么是Web Storage Web Storage是HTML5里面引入的一個類似于cookie的本地存儲功能,可以用于客戶端的本地存儲,其相對于cookie來說有以下幾點優勢: 存儲空間大:cookie只有4KB的存儲空間,而Web Storage在官方建議中為每個…

番石榴秒表

番石榴的秒表是番石榴第10版的另一個新番石榴類(作為Optional ,這是另一篇近期文章的主題)。 顧名思義,這個簡單的類提供了一種方便地測量兩個代碼點之間經過的時間的方法。 與使用System.currentTimeMillis(&#xff…

CF 839 E-最大團

CF 839 E Soltion: 就是怎么求最大團的問題: 以下是\(O(7000\times n^2)\)的做法 求一個最大團,然后將所有的藥水平均分配,到最大團的所有點上,計算答案. #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorit…

sse java_SSE詳解

SSE(Server-Sent Events):通俗解釋起來就是一種基于HTTP的&#xff0c;以流的形式由服務端持續向客戶端發送數據的技術應用場景由于HTTP是無狀態的傳輸協議,每次請求需由客戶端向服務端建立連接,HTTPS還需要交換秘鑰&#xff0c;所以一次請求,建立連接的過程占了很大比例在http…

520. Detect Capital

題目&#xff1a; Given a word, you need to judge whether the usage of capitals in it is right or not. We define the usage of capitals in a word to be right when one of the following cases holds: All letters in this word are capitals, like "USA".A…