目錄介紹
- 10.0.0.1 見過哪些運行時異常?異常處理機制知道哪些?從異常是否必須需要被處理的角度來看怎么分類?
- 10.0.0.2 運用Java異常處理機制?異常處理的原理?Java中檢查異常和非檢查異常的區(qū)別?
- 10.0.0.3 異常處理的過程中,你遵循那些好的實踐? throw 和 throws這兩個關(guān)鍵字在java中有什么不同?
- 10.0.0.4 你知道什么是“異常鏈”嗎?自定義實現(xiàn)過哪些異常,怎么寫的?可以有一個空的catch塊嗎?
- 10.0.0.5 Java異常類有哪些的重要方法?導(dǎo)致“主線程中的異?!钡牟煌瑘鼍笆鞘裁矗?/li>
- 10.0.0.6 看下面這段子類繼承父類代碼有什么問題?針對拋異常是IOException還是Exception,能隨便寫嗎,結(jié)合案例說一下?
- 10.0.0.7 捕獲異常時,為何在catch中要注意異常層級關(guān)系?需要注意哪些問題?
好消息
- 博客筆記大匯總【15年10月到至今】,包括Java基礎(chǔ)及深入知識點,Android技術(shù)博客,Python學(xué)習(xí)筆記等等,還包括平時開發(fā)中遇到的bug匯總,當(dāng)然也在工作之余收集了大量的面試題,長期更新維護并且修正,持續(xù)完善……開源的文件是markdown格式的!同時也開源了生活博客,從12年起,積累共計500篇[近100萬字],將會陸續(xù)發(fā)表到網(wǎng)上,轉(zhuǎn)載請注明出處,謝謝!
- 鏈接地址:https://github.com/yangchong211/YCBlogs
- 如果覺得好,可以star一下,謝謝!當(dāng)然也歡迎提出建議,萬事起于忽微,量變引起質(zhì)變!所有博客將陸續(xù)開源到GitHub!
10.0.0.1 見過哪些運行時異常?異常處理機制知道哪些?從異常是否必須需要被處理的角度來看怎么分類?
- 運行時異常:Throwable繼承層次結(jié)構(gòu),可見分成兩大類Error和Exception:
- Error(錯誤):指程序無法恢復(fù)的異常情況,表示運行應(yīng)用程序中較嚴重的問題;發(fā)生于虛擬機自身、或者在虛擬機試圖執(zhí)行應(yīng)用時,如Virtual MachineError(Java虛擬機運行錯誤)、NoClassDefFoundError(類定義錯誤);屬于不可查異常,即不強制程序員必須處理,即使不處理也不會出現(xiàn)語法錯誤。
- Exception(異常):指程序有可能恢復(fù)的異常情況,表示程序本身可以處理的異常。又分兩大類:
- RuntimeException(運行時異常):由程序自身的問題導(dǎo)致產(chǎn)生的異常;如NullPointerException(空指針異常)、IndexOutOfBoundsException(下標越界異常);屬于不可查異常。
- 非運行時異常:由程序外部的問題引起的異常;除了RuntimeException以外的異常,如FileNotFoundException(文件不存在異常);屬于可查異常,即強制程序員必須進行處理,如果不進行處理則會出現(xiàn)語法錯誤。
- 異常處理機制
- 捕捉異常:由系統(tǒng)自動拋出異常,即try捕獲異常->catch處理異常->finally 最終處理
- 拋出異常:在方法中將異常對象顯性地拋出,之后異常會沿著調(diào)用層次向上拋出,交由調(diào)用它的方法來處理。配合throws聲明拋出的異常和throw拋出異常
- 自定義異常:繼承Execption類或其子類
- 技術(shù)博客大總結(jié)
- 從異常是否必須需要被處理的角度來看怎么分類
- 異常又可分為不受檢查異常和受檢查異常兩種情況:
- 不受檢查異常:派生于 Error 或 RuntimeException 的所有異常;
- 受檢查異常:除去不受檢查異常的所有異常。
10.0.0.2 運用Java異常處理機制? 異常處理的原理?Java中檢查異常和非檢查異常的區(qū)別?
- 運用Java異常處理機制?
- 1.try…catch語句
- 2.finally語句:大多數(shù)情況下都必須執(zhí)行的代碼
- 3.throws子句:聲明可能發(fā)生的異常類
- 4.throw:拋出具體的異常對象。
- 異常處理的原理?
- Java虛擬機用方法調(diào)用棧(method invocation stack)來跟蹤每個線程中一系列的方法調(diào)用過程。如果在執(zhí)行方法過程中拋出異常,則Java虛擬機必須找到能捕獲該異常的catch代碼塊。當(dāng)Java虛擬機追溯到調(diào)用棧的底部的方法的時候,如果仍然沒有找到處理該異常的代碼塊,這樣它就會按步驟處理,首先會打印方法調(diào)用棧的異常信息,然后如果所處的線程不是主線程,那么就會終止這個線程。
- Java中檢查異常和非檢查異常的區(qū)別
- 檢查型異常(CheckedException)
- 在Java中所有不是RuntimeException派生的Exception都是檢查型異常。當(dāng)函數(shù)中存在拋出檢查型異常的操作時該函數(shù)的函數(shù)聲明中必須包含throws語句。調(diào)用改函數(shù)的函數(shù)也必須對該異常進行處理,如不進行處理則必須在調(diào)用函數(shù)上聲明throws語句。
- 檢查型異常是JAVA首創(chuàng)的,在編譯期對異常的處理有強制性的要求。在JDK代碼中大量的異常屬于檢查型異常,包括IOException,SQLException等等。
- 非檢查型異常(UncheckedException)技術(shù)博客大總結(jié)
- 在Java中所有RuntimeException的派生類都是非檢查型異常,與檢查型異常對比,非檢查型異??梢圆辉诤瘮?shù)聲明中添加throws語句,調(diào)用函數(shù)上也不需要強制處理。
- 常見的NullPointException,ClassCastException是常見的非檢查型異常。非檢查型異常可以不使用try…catch進行處理,但是如果有異常產(chǎn)生,則異常將由JVM進行處理。對于RuntimeException的子類最好也使用異常處理機制。雖然RuntimeException的異??梢圆皇褂胻ry…catch進行處理,但是如果一旦發(fā)生異常,則肯定會導(dǎo)致程序中斷執(zhí)行,所以,為了保證程序再出錯后依然可以執(zhí)行,在開發(fā)代碼時最好使用try…catch的異常處理機制進行處理。
10.0.0.3 異常處理的過程中,你遵循那些好的實踐? throw 和 throws這兩個關(guān)鍵字在java中有什么不同?
- 異常處理的過程中,你遵循那些好的實踐?
- 異常處理在項目設(shè)計中是非常關(guān)鍵的,所以精通異常處理是十分必要的。異常處理有很多最佳實踐,下面列舉集中,它們提高你代碼的健壯性和靈活性:
- 1) 調(diào)用方法的時候返回布爾值來代替返回null,這樣可以 NullPointerException。由于空指針是java異常里最惡心的異常。
- 2) catch塊里別不寫代碼。空catch塊是異常處理里的錯誤事件,因為它只是捕獲了異常,卻沒有任何處理或者提示。通常你起碼要打印出異常信息,當(dāng)然你最好根據(jù)需求對異常信息進行處理。
- 3)能拋受控異常(checked Exception)就盡量不拋受非控異常(checked Exception)。通過去掉重復(fù)的異常處理代碼,可以提高代碼的可讀性。
- 4) 絕對不要讓你的數(shù)據(jù)庫相關(guān)異常顯示到客戶端。由于絕大多數(shù)數(shù)據(jù)庫和SQLException異常都是受控異常,在Java中,你應(yīng)該在DAO層把異常信息處理,然后返回處理過的能讓用戶看懂并根據(jù)異常提示信息改正操作的異常信息。
- 5) 在Java中,一定要在數(shù)據(jù)庫連接,數(shù)據(jù)庫查詢,流處理后,在finally塊中調(diào)用close()方法。
- throw 和 throws這兩個關(guān)鍵字在java中有什么不同?
10.0.0.4 你知道什么是“異常鏈”嗎?自定義實現(xiàn)過哪些異常,怎么寫的?可以有一個空的catch塊嗎?
- 你知道什么是“異常鏈”嗎?
- “異常鏈”是Java中非常流行的異常處理概念,是指在進行一個異常處理時拋出了另外一個異常,由此產(chǎn)生了一個異常鏈條。該技術(shù)大多用于將“ 受檢查異?!?( checked exception)封裝成為“非受檢查異常”(unchecked exception)或者RuntimeException。順便說一下,如果因為因為異常你決定拋出一個新的異常,你一定要包含原有的異常,這樣,處理程序才可以通過getCause()和initCause()方法來訪問異常最終的根源。
- 自定義實現(xiàn)過哪些異常?
- 可以有一個空的catch塊嗎?
- 可以有一個空的catch塊,但這是最糟糕的編程的例子。不應(yīng)該有空的catch塊,因為如果異常被該塊捕獲,我們將沒有關(guān)于異常的信息,它將成為調(diào)試它的噩夢。應(yīng)該至少有一個日志記錄語句來記錄控制臺或日志文件中的異常詳細信息。
- 技術(shù)博客大總結(jié)
10.0.0.5 Java異常類有哪些的重要方法?導(dǎo)致“主線程中的異常”的不同場景是什么?
- Java異常類有哪些的重要方法?
- Exception和它的所有子類沒有提供任何特殊方法供使用,它們的所有方法都是來自其基類Throwable。
- String getMessage():方法返回Throwable的String型信息,當(dāng)異常通過構(gòu)造器創(chuàng)建后可用。
- String getLocalizedMessage():此方法通過被重寫來得到用本地語言表示的異常信息返回給調(diào)用程序。Throwable類通常只是用getMessage()方法來實現(xiàn)返回異常信息。
- synchronized Throwable getCause():此方法返回異常產(chǎn)生的原因,如果不知道原因的話返回null。(原文有拼寫錯誤 應(yīng)該是if 不是id)
- String toString():方法返回String格式的Throwable信息,此信息包括Throwable的名字和本地化信息。
- void printStackTrace():該方法打印棧軌跡信息到標準錯誤流。該方法能接受PrintStream 和PrintWriter作為參數(shù)實現(xiàn)重載,這樣就能實現(xiàn)打印棧軌跡到文件或流中。
- 導(dǎo)致“主線程中的異?!钡牟煌瑘鼍笆鞘裁??
- 一些常見的主線程異常情況是:
- 線程main java.lang.UnsupportedClassVersionError中的異常:當(dāng)您的java類從另一個JDK版本編譯并且您試圖從另一個java版本運行它時,會出現(xiàn)此異常。
- 線程main java.lang.NoClassDefFoundError中的異常 :此異常有兩種變體。 第一個是你提供擴展名為.class的類全名的地方。 第二種情況是沒有找到類。
- 線程main java.lang.NoSuchMethodError中的異常:main :當(dāng)您嘗試運行一個沒有main方法的類時,會出現(xiàn)此異常。
- 技術(shù)博客大總結(jié)
- 線程“main”中的異常java.lang.ArithmeticException :無論何時從main方法拋出任何異常,它都會打印出異常是console。 第一部分解釋了異常從main方法拋出,第二部分打印異常類名稱,然后在冒號后打印異常消息。
10.0.0.6 看下面這段子類繼承父類代碼有什么問題?針對拋異常是IOException還是Exception,能隨便寫嗎,結(jié)合案例說一下?
看下面這段代碼有什么問題?
創(chuàng)新互聯(lián)建站專注于中大型企業(yè)的做網(wǎng)站、成都做網(wǎng)站和網(wǎng)站改版、網(wǎng)站營銷服務(wù),追求商業(yè)策劃與數(shù)據(jù)分析、創(chuàng)意藝術(shù)與技術(shù)開發(fā)的融合,累計客戶千余家,服務(wù)滿意度達97%。幫助廣大客戶順利對接上互聯(lián)網(wǎng)浪潮,準確優(yōu)選出符合自己需要的互聯(lián)網(wǎng)運用,我們將一直專注品牌網(wǎng)站建設(shè)和互聯(lián)網(wǎng)程序開發(fā),在前進的路上,與客戶一起成長!public class SuperClass {
public void start() throws IOException{
throw new IOException("Not able to open file");
}
}
public class SubClass extends SuperClass{
public void start() throws Exception{
throw new Exception("Not able to start");
}
}
- 這段代碼編譯器將對子類覆蓋start方法產(chǎn)生錯誤。因為每個Java中方法的覆蓋是有規(guī)則的,一個覆蓋的方法不能拋出的異常比原方法繼承關(guān)系高。因為這里的start方法在超類中拋出了IOException,所有在子類中的start方法只能拋出要么是IOExcepition或是其子類,但不能是其超類,如Exception。
針對拋異常是IOException還是Exception,能隨便寫嗎,結(jié)合案例說一下?
public static void main(String args[]) {
try{
start();
}catch(IOException e){
e.printStackTrace();
}
}
- 上面的Java異常例子代碼中,編譯器將在處理IOException時報錯,因為IOException是受檢查異常,而start方法并沒有拋出IOException,所以編譯器將拋出“異常,java.io.IOException不會在try語句體中拋出”,但是如果你將IOException改為Exception,編譯器報錯將消失,因為Exception可以用來捕捉所有運行時異常,這樣就不需要聲明拋出語句。我喜歡這樣帶有迷惑性的Java異常面試題,因為它不會讓人輕易的找出是IOException還是Exception。你也可以在JoshuaBloach和NeilGafter的Java謎題中找到一些有關(guān)Java錯誤和異常的具有迷惑性問題。
10.0.0.7 捕獲異常時,為何在catch中要注意異常層級關(guān)系?需要注意哪些問題?
捕獲異常時,為何在catch中要注意異常層級關(guān)系?需要注意哪些問題?
public static void main(String args[]) {
try {
start();
} catch (Exception e) {
e.printStackTrace();
} catch (RuntimeException e2) {
e2.printStackTrace();
}
}
- 這段代碼會在捕捉異常代碼塊的RuntimeException類型變量“e2”里拋出編譯異常錯誤。因為Exception是RuntimeException的超類,在start方法中所有的RuntimeException會被第一個捕捉異常塊捕捉,這樣就無法到達第二個捕捉塊,這就是拋出“exception java.lang.RuntimeException has already been caught”的編譯錯誤原因。
其他介紹
01.關(guān)于博客匯總鏈接
- 1.技術(shù)博客匯總
- 2.開源項目匯總
- 3.生活博客匯總
- 4.喜馬拉雅音頻匯總
- 5.其他匯總
02.關(guān)于我的博客
- 我的個人站點:www.yczbj.org,www.ycbjie.cn
- github:https://github.com/yangchong211
- 知乎:https://www.zhihu.com/people/yang-chong-69-24/pins/posts
- 簡書:http://www.jianshu.com/u/b7b2c6ed9284
- csdn:http://my.csdn.net/m0_37700275
- 喜馬拉雅聽書:http://www.ximalaya.com/zhubo/71989305/
- 開源中國:https://my.oschina.net/zbj1618/blog
- 泡在網(wǎng)上的日子:http://www.jcodecraeer.com/member/content_list.php?channelid=1
- 郵箱:yangchong211@163.com
- 阿里云博客:https://yq.aliyun.com/users/article?spm=5176.100- 239.headeruserinfo.3.dT4bcV
- segmentfault頭條:https://segmentfault.com/u/xiangjianyu/articles
- 掘金:https://juejin.im/user/5939433efe88c2006afa0c6e
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
網(wǎng)頁標題:10.Java異常問題-創(chuàng)新互聯(lián)
URL網(wǎng)址:
http://weahome.cn/article/djhjes.html