一篇不錯的講解Java異常的文章
六種異常處理的陋習
你覺得自己是一個Java專家嗎?是否肯定自己已經全面掌握了Java的異常處理機制?在下面這段程式碼中,你能夠迅速找出異常處理的六個問題嗎?
1
OutputStreamWriter
out
=
...
2
java.sql.Connection conn = ...
3
try
{
//
⑸
4
Statement stat = conn.createStatement();
5
ResultSet rs = stat.executeQuery(
6
"select
uid, name from user"
);
7
while
(rs.next())
8
{
9
out
.println(
"ID:"
+
rs.getString(
"uid"
)
//
⑹
10
",姓名:"
+
rs.getString(
"name"
));
11
}
12
conn.close();
//
⑶
13
out
.close();
14
}
15
catch
(Exception
ex)
//
⑵
16
{
17
ex.printStackTrace();
//⑴,⑷
18
}
作為一個Java程式設計師,你至少應該能夠找出兩個問題。但是,如果你不能找出全部六個問題,請繼續閱讀本文。
本文討論的不是Java異常處理的一般性原則,因為這些原則已經被大多數人熟知。我們要做的是分析各種可稱為“反例”(anti-pattern)的違背優秀編碼規範的常見壞習慣,幫助讀者熟悉這些典型的反面例子,從而能夠在實際工作中敏銳地察覺和避免這些問題。
反例之一:丟棄異常
程式碼:15行-18行。
這段程式碼捕獲了異常卻不作任何處理,可以算得上Java程式設計中的殺手。從問題出現的頻繁程度和禍害程度來看,它也許可以和C/C++程式的一個惡名遠播的問題相提並論??不檢查緩衝區是否已滿。如果你看到了這種丟棄(而不是丟擲)異常的情況,可以百分之九十九地肯定程式碼存在問題(在極少數情況下,這段程式碼有存在的理由,但最好加上完整的註釋,以免引起別人誤解)。
這段程式碼的錯誤在於,異常(幾乎)總是意味著某些事情不對勁了,或者說至少發生了某些不尋常的事情,我們不應該對程式發出的求救訊號保持沉默和無動於衷。呼叫一下printStackTrace算不上“處理異常”。不錯,呼叫printStackTrace對除錯程式有幫助,但程式除錯階段結束之後,printStackTrace就不應再在異常處理模組中擔負主要責任了。
丟棄異常的情形非常普遍。開啟JDK的ThreadDeath類的文件,可以看到下面這段說明:“特別地,雖然出現ThreadDeath是一種‘正常的情形’,但ThreadDeath類是Error而不是Exception的子類,因為許多應用會捕獲所有的Exception然後丟棄它不再理睬。”這段話的意思是,雖然ThreadDeath代表的是一種普通的問題,但鑑於許多應用會試圖捕獲所有異常然後不予以適當的處理,所以JDK把
ThreadDeath定義成了Error的子類,因為Error類代表的是一般的應用不應該去捕獲的嚴重問題。可見,丟棄異常這一壞習慣是如此常見,它甚至已經影響到了Java本身的設計。
那麼,應該怎樣改正呢?主要有四個選擇:
1、處理異常。針對該異常採取一些行動,例如修正問題、提醒某個人或進行其他一些處理,要根據具體的情形確定應該採取的動作。再次說明,呼叫printStackTrace算不上已經“處理好了異常”。
2、重新丟擲異常。處理異常的程式碼在分析異常之後,認為自己不能處理它,重新丟擲異常也不失為一種選擇。
3、把該異常轉換成另一種異常。大多數情況下,這是指把一個低階的異常轉換成應用級的異常(其含義更容易被使用者瞭解的異常)。
4、不要捕獲異常。
結論一:既然捕獲了異常,就要對它進行適當的處理。不要捕獲異常之後又把它丟棄,不予理睬。
反例之二:不指定具體的異常
程式碼:15行。
許多時候人們會被這樣一種“美妙的”想法吸引:用一個
catch
語句捕獲所有的異常。最常見的情形就是使用
catch
(Exception
ex)語句。但實際上,在絕大多數情況下,這種做法不值得提倡。為什麼呢?
相關推薦
一篇不錯的講解Java異常的文章
六種異常處理的陋習
你覺得自己是一個Java專家嗎?是否肯定自己已經全面掌握了Java的異常處理機制?在下面這段程式碼中,你能夠迅速找出異常處理的六個問題嗎?
看到一篇不錯的文章 轉載一下:原碼, 反碼, 補碼 詳解
本篇文章講解了計算機的原碼, 反碼和補碼. 並且進行了深入探求了為何要使用反碼和補碼, 以及更進一步的論證了為何可以用反碼, 補碼的加法計算原碼的減法. 論證部分如有不對的地方請各位牛人幫忙指正! 希望本文對大家學習計算機基礎有所幫助!
一. 機器數和真值
在學習原碼, 反碼和補碼之前, 需要先了解
一篇不錯的面試文章
前言
打算換個工作,近一個月面試了不少的公司,下面將一些面試經驗和思考分享給大家。另外校招也快要開始了,為在校的學生提供一些經驗供參考,希望都能找到滿意的工作。
剛開始面試的幾家公司,就是備受各種打擊、就是一頓狂問,結果答上來的問題沒
一篇不錯的Fresco文章
今天只是入門級別的,改天會出一個深度一點的文章介紹用法。
題外話:最近消沉了有快三個月了,這幾天都不知道自己在幹嘛,這是春節之後的第一篇博文,從今天開始讓一切都不一樣:
Code Behavior, one can.t be less.
Fres
oracle之sequence的cache解析,一篇不錯的文章
SQL> oradebug setmypid;
已處理的語句
SQL> oradebug unlimit;
已處理的語句
SQL> oradebugevent 10046 trace name context forever, level 12
已處理的
【Java入門提高篇】Day16 Java異常處理(下)
http final 自定義異常 2個 輸入 也有 推薦 錯誤 num 今天繼續講解java中的異常處理機制,主要介紹Exception家族的主要成員,自定義異常,以及異常處理的正確姿勢。
Exception家族
一圖勝千言,先來看一張圖。
Excepti
一篇完全瞭解java關鍵字synchronized
title: synchronized解析 tags: java 鎖 author: 辰砂
一、總體概述圖
二、實現原理
monitorenter:
每個物件有一個monitor,即監視器,當且僅當monitor被佔用時,這個monitor就被鎖住了。執行緒執行monitorente
一篇就學會Java中volatile!
當一個變數定義為 volatile 之後,將具備兩種特性:
1.保證此變數斷點記憶體可見性。
2.禁止指令重排序優化。
以上
如果你想了解更多請往下讀
一、什麼事記憶體可見性呢?
我們都知道處理器有多個核,每個核都有cache,這樣每個核的cache就可能發生不同步的情況,一個核心對這個變數做了修
【華為】弟弟發過來一篇關於華為的文章
題目《華為離職員工:都說主管有份短名單 就像閻王的生死簿》
這篇文章講的是一個在華為工作了12年、年紀在38歲左右的人(2005年碩士畢業 26歲),在離職後回顧自己的經歷時的反思。
38歲啊!這麼快!
我認為,演說者表達了兩方面意思:
(1)他後悔在工作期間只挑好走
整理了一篇 linux 環境配置的文章
安裝之前先檢查一下系統有沒有自帶open-jdk
命令:
rpm -qa |grep java
rpm -qa |grep jdk
rpm -qa |grep gcj
如果沒有輸入資訊表示沒有安裝。
如果安裝可以使用rpm -qa | grep java | x
Java異常處理終結篇——如何進行Java異常處理設計
有一句這樣話:一個衡量Java設計師水平和開發團隊紀律性的好方法就是讀讀他們應用程式裡的異常處理程式碼。
本文主要討論開發Java程式時,如何設計異常處理的程式碼,如何時拋異常,捕獲到了怎麼處理,而不是講異常處理的機制和原理。
在我自己研究Java異常處理之前,我查過
一篇關於程式設計師的文章
很不錯,轉載一下。
確定方向
選擇比努力更重要
關於方向的選擇其實越早確定越好,生活中我們要面臨無數個選擇,前幾天看的一個黑客相關的美劇中有句臺詞說的不錯:
life is binary
生活就是二進位制,一個個0101組成的。每一次抉擇,選了就是1,不選就是0。另
一篇不錯的libevent入門教程
首先給出官方文件吧:http://libevent.org ,首頁有個Programming with Libevent,裡面是一節一節的介紹libevent,但是感覺資訊量太大了,而且還是英文的-。-(當然,如果想好好用libevent,看看還是很有必要的
一篇很好的es6文章
剛開始用vue或者react,很多時候我們都會把ES6這個大兄弟加入我們的技術棧中。但是ES6那麼多那麼多特性,我們真的需要全部都掌握嗎?秉著二八原則,掌握好常用的、有用的這個可以讓我們的開發快速起飛。接下來我們就聊聊ES6那些可愛的新特性吧。1.變數宣告const和let在ES6之前,我們都是用var關鍵字
一篇關於CountDownLatch的好文章
convert itl 一次 什麽 thread 並行執行 volatil his ets CountDownLatch簡介
CountDownLatch是一種java.util.concurrent包下一個同步工具類,它允許一個或多個線程等待直到在其他線程操作執行完成。
介紹一篇關於session的好文章,寫的很詳細(jsp-servlet 技術)
介紹一篇關於session的好文章,寫的很詳細(jsp-servlet 技術)
摘要:雖然session機制在web應用程式中被採用已經很長時間了,但是仍然有很多人不清楚session機制的本質,以至不能正確的應用這一技術。本文將詳細討論session的工作機制並且對在Ja
一篇不錯的fvwm入門教程.
原文出處: http://learn.tsinghua.edu.cn/homepage/2003214890/publish/GNU/fvwm.html
FVWM 的旅程
先去看看王垠寫的 Fvwm簡明使用手冊 ,然後到 FVWM 看看 screenshots ,最好挑
一文讀懂 JAVA 異常處理
jdk 如何 堆棧溢出 細節 fileread 空指針 note handle 優雅 JAVA 異常類型結構Error 和 Exeption受查異常和非受查異常異常的拋出與捕獲直接拋出異常封裝異常並拋出捕獲異常自定義異常try-catch-finallytry-with-r
偶然發現的一篇相見很晚的文章:如何學好遊戲程式設計
2。遊戲程式設計所需要的基礎知識
我這裡介紹下要做一個好的,稱職的,遊戲程式設計師所需要。學習就和蓋樓一樣,要想上層
建築牢固,你就要有堅實的基礎,我這裡介紹的基礎是你從事遊戲程式設計最基礎,基礎的不
能再基礎的東西。
2。1 數學
數學是遊戲中支柱,沒有了它,任何都不要談,在你編寫你遊戲的時候,
一文了解java異常機制
1.異常的概述
1.1什麼是異常?
異常:程式在執行過程中發生由於外部問題導致的程式異常事件,發生的異常會中斷程式的執行。(在Java等面向物件的程式語言中)異常本身是一個物件,產生異常就是產生了一個異常物件。注意在java中異常不是錯誤,在下文的異常的分類中有解釋。
舉個生活中的栗子來說明異常吧,假如