电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java受檢異常的一些思考

瀏覽:19日期:2022-08-19 16:29:04
什么是異常?

要了解受檢異常,首先要了解什么是異常。

在Java中,異常是一套能夠一致地處理錯誤和恢復代碼運行正常的機制。

在C語言中,他沒有異常處理機制。如果一個函數出現了異常情況,例如一個除法的函數,被除數輸入了0,這個時候需要把這個異常告訴函數調用者,一般情況下我們會通過返回一個特殊的值來告訴調用者出現異常,如返回-1。這是c語言常規的處理異常手法。這會引發另一個問題:我們需要在每次調用函數的時候,都進行條件判斷,看返回值是否出現了異常,這樣會讓我們的代碼出現了非常多的if判斷語句。《Java編程思想》一書中講到:每次調用的時候都必須執行條件測試,以確定會產生何種結果。這使程序難以閱讀并且有可能降低運行效率,因此程序員們既不愿意指出,也不愿意處理異常

不僅代碼不美觀和寫很多的代碼,而且容易漏掉一些情況沒有進行判斷,沒有安全感。

這個是否需要有一套完整的異常處理機制,當出現問題的時候,把異常交給機制去處理,這樣我們就可以把處理異常的代碼和正常的代碼分開,且不擔心出現“漏網之魚”。因而我們需要:

一套統一的錯誤報告機制,可以減少代碼量、代碼簡潔的同時,能夠把錯誤進行統一處理,不會有漏網之魚。

關于這個問題在《Java編程思想》中是這樣說的:異常往往能降低錯誤處理代碼的復雜度。如果不使用異常,那么就必須檢查特定的錯誤,并在程序中的許多地方去處理它。而如果使用異常,那就不必在方法調用處進行檢查,因為異常機制將保證能夠捕獲這個錯誤。理想情況下,只需在一個地方處理錯誤,即所謂的異常處理程序中。這種方式不僅節省代碼,而且把“描述在正常執行過程中做什么事”的代碼和“出了問題怎么辦”的代碼相分離。總之,與以前的錯誤處理方法相比,異常機制使代碼的閱讀、編寫和調試工作更加井井有條。Java異常機制比常規的錯誤報告機制還做到了:

我們可以在一個地方集中處理錯誤,把正常的代碼處理邏輯和錯誤情況處理邏輯分離,使用代碼的閱讀、編寫和調試更加井井有條。

編譯時還是運行時?

熟悉Java開發的讀者知道Java異常機制擁有兩種大類型的異常:運行時異常和編譯時異常。

編譯時異常是在編譯的時候就能被檢查出來的異常,也被稱為受檢異常(Checked Exception)。如IOException。運行時異常就是在運行的時候才會被檢查的異常,如空指針異常。

而我們今天要討論的就是關于運行時異常。這兩種異常的本質差別是:檢查的時機。一般情況來說,錯誤能在編譯階段就被檢查出來是最好的,編譯器幫我們解決錯誤。然而情況也不一定都是這樣,因為處理異常需要我們寫出更多的代碼。如果每次調用一個方法都需要處理所有的異常,那么我們需要的工作量就太大了。例如空指針,我們知道幾乎每個方法都會拋出這個異常,但是java并沒有強制我們去捕獲他。所以異常處理時機的分類是一個權衡的結果,既想讓編譯器盡多地幫我們檢查錯誤,又不能讓開發者代碼編寫太多額外的代碼,需要在這兩者之間找到一個最平衡的點。

“受檢異常”究竟可不可取?

這個問題其實爭論的歷史非常久,新型語言Kotlin中就把受檢異常去掉了。這樣我們就沒必要再去顯示捕獲任何異常。這在我第一次接觸kotlin的時候感覺簡直是一個噩夢:

因為我不知道調用的方法是否會拋出異常、拋出什么異常,那么我可能會忽略一些關鍵的異常沒有捕獲而導致代碼的健壯性降低。

這也確實也是很多支持Java受檢異常開發者的心聲。有了受檢異常,那么編譯器會提醒我們我們調用的這個方法會拋出什么異常,我們需要去使用try-catch來捕獲他,不會遺漏任何重要的異常。但事實真的如此嗎?

受檢異常真的能夠避免所有的異常嗎?不是的,我們依舊會出現空指針異常、非法狀態異常等,我們并不會去顯示捕獲這一類的異常,他在java中稱為運行時異常。那有讀者可能會說:受檢異常是可以讓我們避免一些方法顯示拋出的異常,并不是要處理所有的錯誤。因而,我們必須呀承認一個事實:無論是否有受檢異常,均不能解決所有的異常,兩者的差別是編譯階段處理異常的數量。而這兩者的邊界是一種權衡的結果使用受檢異常,我們真的處理異常了嗎?

CLU 的設計師們認為:我們覺得強迫程序員在不知道該采取什么措施的時候提供處理程序,是不現實的,只有在你知道如何處理的情況下才捕獲異常。

Stroustrup 這樣認為:這樣一來幾乎所有的函數都得提供異常說明了,也就都得重新編譯,而且還會妨礙它同其他語言的交互。這樣會迫使程序員違反異常處理機制的約束,他們會寫欺騙程序來掩蓋異常。這將給沒有注意到這些異常的人造成一種虛假的安全感

我們會發現現在的一種情況是:開發者捕獲異常之后,并沒有做具體的處理,而是對異常進行打印,或者干脆不做任何處理,這是不符合異常的規則的。只有知道如何處理異常的情況下才去捕獲異常。如果捕獲異常之后卻不做任何處理,那么實際上是把異常“吃了”。因為如果異常發生了,我們以為我們處理了,但事實上我們并沒有做任何處理,那么這個錯誤就會一直存在,反而更不利于我們對代碼健壯性的維護。有讀者可能會覺得,我們對于不知如何處理的異常可以往上拋,這會導致另一個問題:頂層接口的調用者會拿到非常多的異常類型而不知如何處理,最終只能向上拋給控制臺,從而使得整套異常機制完全失效。

我們知道異常機制的目的之一就是為了減少代碼,不用每次調用一個方法都去進行條件判斷,而通過使用try-catch就可以把錯誤進行集中處理,把正常代碼的邏輯和處理異常的邏輯分離開來,但是,受檢異常的存在,當我們即使調用一個Thread.sleep()方法都必須進行try-catch,又如IO流的開啟與關閉也都必須進行try-catch,,這樣的代碼量其實又回到原地了,并沒有達到最初的目標:減少代碼量。

《Java編程思想》一書認為:不在于編譯器是否會強制程序員去處理錯誤,而是要有一致的、使用異常來報告錯誤的模型;不在于什么時候進行檢查,而是一定要有類型檢查。也就是說,必須強制程序使用正確的類型,至于這種強制施加于編譯時還是運行時,那倒沒關系。

即異常機制的重點在于一致的使用報告錯誤的模式和強制程序使用正確的類型。所以異常的存在,并不是要我們在編譯時把所有異常都處理了,而是我們可以統一處理異常且讓程序使用正確的類型。

我的觀點

上面講到我第一次接觸到kotlin的時候非常反感他把checkedException去掉了,這讓我非常沒有安全感,我的原因是:調用別人的接口的時候,這時候沒有編譯器的提醒我會遺漏關鍵的異常而導致代碼的健壯性下降。但,正如上述,如果不知道如何處理異常而去捕獲異常,然后不做任何處理,這是在欺騙自己,獲得一種虛假的安全感。我們并沒有解決異常,而是把異常“吃了”,看起來程序并沒有崩潰,但事實上我們只是把異常藏起來了,沒有做任何處理。這種情況不如把異常往上拋到最頂層交給控制臺處理,我們知道程序崩潰了,那么我們就知道得去解決這種異常,這樣才能真正促進代碼的健壯性。

而向上拋會會導致另一個問題:頂層接口的調用者會拿到非常多的異常而不知道如何處理,再次向上拋,最終導致整個異常機制失效。而如果每一層都只處理自己感興趣的異常,剩下的異常就會自動拋到最頂層,代碼會更加簡潔,我們也可以更加專注我們要處理的異常。

這兩個是我覺得“受檢異常”的硬傷,。而其他,如頻繁try-catch導致代碼量增多,兩種類型的代碼導致邏輯不連貫等,相對來說這屬于軟傷,在面對“可以在編譯階段解決更多的異常并沒有更強的說服力。

去掉受檢異常對于java工程師來說可能會很沒有安全感,因為:會存在一些異常沒有處理,他們就像一些炸彈,但不知道他們什么時候爆炸。這確實是個問題,沒有受檢異常會有更多的異常留到運行時。但這個問題影響的效果可能并沒有我們想象中的那么大。我們真正處理受檢異常機制提醒的異常其實并不多,正如我上面所講,如果我們捕獲異常之后只是“吃掉它”,那么還不如拋給控制臺。

那么“受檢異常”是不是就一無是處?我覺得不是的。受檢異常的目的是在編譯階段處理異常,去掉確實可以避免上述的兩個問題,且讓代碼更加的簡潔。但是換之的是需要給測試人員更多的壓力和開發者自身的對代碼健壯性的處理,需要有更多的精力去解決沒有“受檢異常”帶來的問題。不是有“全局捕獲異常嗎”?頻繁的崩潰和維護,并不是一個好的解決方案,如果能在編碼階段就把隱藏的問題解決是最好不過的。

從我自己的經歷來說,我使用java和kotlin語言均開發過不同的項目,而沒有受檢異常并沒有給我帶來多大的障礙,反而不用使用try-catch讓我在編寫代碼的時候更加舒適。但因我項目較小,所以可能并不能作為一個示例來證明,僅作為一個參考。而kotlin在這方面有一個我認為不好的特點:沒有異常聲明。即如果我想要看我調用的方法究竟會拋出什么異常時,需要一行一行代碼去查看,而無法通過異常聲明來得知。

所以,需要怎么做?我認為這兩種解決方案各有千秋,看開發者如何取舍。而我個人覺得這是這種異常機制的限制,我們需要的是對異常機制的改進,如Java有了進行注解對異常進行忽略,這是一種進步。對這個問題的討論正如對洋蔥好不好吃的討論是差不多的,不同的團隊不同的需求取舍,會有不同的結果。討論這個問題更重要的是了解不同的解決方案有不同的優缺點,我們在開發的時候,可以發揮不同處理方案的優勢,注意不要踩坑。

沒有最好的語言,只有更好的開發者。如果我們能夠在每層都解決自己應該負責解決的異常,那么頂層接口就不會有高達八十多種異常的出現。如果對每種異常捕獲之后都能夠做好對應的處理,而不是把異常“吃掉”來獲得虛假的安全感,那么受檢異常也沒有那么多的問題。如果我們可以更加規范地開發,那么受檢異常,事實上問題也不會那么多。簡單粗暴去除掉受檢異常,可以通過迎合大部分開發者的惰性和不規范來解決受檢異常存在的問題,但是這并不是最好的解決方法。所以我們能做的,不是去捍衛不同的立場,而是不斷地提升自己的代碼規范,通過代碼規范來增強代碼的健壯性。

以上就是Java受檢異常的一些思考的詳細內容,更多關于Java受檢異常的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 螺旋绞龙叶片,螺旋输送机厂家,山东螺旋输送机-淄博长江机械制造有限公司 | 合肥白癜风医院_合肥治疗白癜风医院_合肥看白癜风医院哪家好_合肥华研白癜风医院 | 磁力去毛刺机_去毛刺磁力抛光机_磁力光饰机_磁力滚抛机_精密金属零件去毛刺机厂家-冠古科技 | 篮球地板厂家_舞台木地板品牌_体育运动地板厂家_凯洁地板 | 高空重型升降平台_高空液压举升平台_高空作业平台_移动式升降机-河南华鹰机械设备有限公司 | 浙江富广阀门有限公司 | 对辊破碎机-液压双辊式,强力双齿辊,四辊破碎机价格_巩义市金联机械设备生产厂家 | 油缸定制-液压油缸厂家-无锡大鸿液压气动成套有限公司 | 高压绝缘垫-红色配电房绝缘垫-绿色高压绝缘地毯-上海苏海电气 | 湖南档案密集架,智能,物证,移动,价格-湖南档案密集架厂家 | 不锈钢复合板厂家_钛钢复合板批发_铜铝复合板供应-威海泓方金属复合材料股份有限公司 | 线粒体膜电位荧光探针-细胞膜-标记二抗-上海复申生物科技有限公司 | 防爆电机生产厂家,YBK3电动机,YBX3系列防爆电机,YBX4节防爆电机--河南省南洋防爆电机有限公司 | 铝箔袋,铝箔袋厂家,东莞铝箔袋,防静电铝箔袋,防静电屏蔽袋,防静电真空袋,真空袋-东莞铭晋让您的产品与众不同 | 媒介云-全网整合营销_成都新闻媒体发稿_软文发布平台 | 下水道疏通_管道疏通_马桶疏通_附近疏通电话- 立刻通 | 不发火防静电金属骨料_无机磨石_水泥自流平_修补砂浆厂家「圣威特」 | 电解抛光加工_不锈钢电解抛光_常州安谱金属制品有限公司 | 磁力链接搜索神器_BT磁力狗_CILIMAO磁力猫_高效磁力搜索引擎2024 | 上海logo设计| 耐酸碱胶管_耐腐蚀软管总成_化学品输送软管_漯河利通液压科技耐油耐磨喷砂软管|耐腐蚀化学软管 | 纯化水设备-EDI-制药-实验室-二级反渗透-高纯水|超纯水设备 | 沈阳庭院景观设计_私家花园_别墅庭院设计_阳台楼顶花园设计施工公司-【沈阳现代时园艺景观工程有限公司】 | 塑料脸盆批发,塑料盆生产厂家,临沂塑料广告盆,临沂家用塑料盆-临沂市永顺塑业 | 光照全温振荡器(智能型)-恒隆仪器 | 屏蔽泵厂家,化工屏蔽泵_维修-淄博泵业 | 砍排机-锯骨机-冻肉切丁机-熟肉切片机-预制菜生产线一站式服务厂商 - 广州市祥九瑞盈机械设备有限公司 | 行星搅拌机,双行星搅拌机,动力混合机,无锡米克斯行星搅拌机生产厂家 | 猎头招聘_深圳猎头公司_知名猎头公司 | 净化车间装修_合肥厂房无尘室设计_合肥工厂洁净工程装修公司-安徽盛世和居装饰 | 艺术涂料|木纹漆施工|稻草漆厂家|马来漆|石桦奴|水泥漆|选加河南天工涂料 | 宁夏档案密集柜,智能密集柜,电动手摇密集柜-盛隆柜业宁夏档案密集柜厂家 | 英国雷迪地下管线探测仪-雷迪RD8100管线仪-多功能数字听漏仪-北京迪瑞进创科技有限公司 | 微型气象仪_气象传感器_防爆气象传感器-天合传感器大全 | 婚博会2024时间表_婚博会门票领取_婚博会地址-婚博会官网 | 杜康白酒加盟_杜康酒代理_杜康酒招商加盟官网_杜康酒厂加盟总代理—杜康酒神全国运营中心 | 生产自动包装秤_颗粒包装秤_肥料包装秤等包装机械-郑州鑫晟重工科技有限公司 | 地图标注|微信高德百度地图标注|地图标记-做地图[ZuoMap.com] | 山东臭氧发生器,臭氧发生器厂家-山东瑞华环保设备 | 厂房出租_厂房出售_产业园区招商_工业地产 - 中工招商网 | 硫化罐-胶管硫化罐-山东鑫泰鑫智能装备有限公司 |