難度
初級
學(xué)習(xí)時間30分鐘
適合人群零基礎(chǔ)
開發(fā)語言Java
開發(fā)環(huán)境JDK v11IntelliJ IDEA v2018.3友情提示本教學(xué)屬于系列教學(xué),內(nèi)容具有連貫性,本章使用到的內(nèi)容之前教學(xué)中都有詳細(xì)講解。本章內(nèi)容針對零基礎(chǔ)或基礎(chǔ)較差的同學(xué)比較友好,可能對于有基礎(chǔ)的同學(xué)來說很簡單,希望大家可以根據(jù)自己的實際情況選擇繼續(xù)看完或等待看下一篇文章。謝謝大家的諒解!1.異常體系在Java異常這個大家族中,Throwable是這個異常家族中的老大,它下面有兩個靠譜老弟,一個叫“Error”,一個叫“Exception”。Error老弟負(fù)責(zé)錯誤部門,Exception老弟負(fù)責(zé)異常部門,在Exception部門下面有一個特殊的弟弟,叫“RuntimeException”,RuntimeException負(fù)責(zé)運行時異常,它們各司其職。什么叫“運行時異常”?下一小節(jié)給大家解釋,先看看它們的結(jié)構(gòu)圖:
紅色部分就是RuntimeException(運行時異常)。可以看到它位于Exception的下面,屬于Exception的子類。
Throwable在《“全棧2019”Java異常第十六章:Throwable詳解》一章中已經(jīng)介紹過了。
Error在《“全棧2019”Java異常第十七章:Error詳解》一章中介紹過。
而Exception在上一章《“全棧2019”Java異常第十八章:Exception詳解》中介紹過。
本章就來介紹RuntimeException。
2.運行時異常“異常”這個詞我們并不陌生,在Java異常系列文章的第一篇《“全棧2019”Java異常第一章:什么是異常?》中,我們就認(rèn)識了異常。
那什么是運行時異常呢?
運行時異常是在Java虛擬機的正常運行期間可以拋出的那些異常。
不明白沒有關(guān)系,我們來分詞解釋+舉例說明。
“運行時異常是 在Java虛擬機的正常運行期間 可以拋出的 那些異常。”分為四組來看,分別是“運行時異常是”、“在Java虛擬機的正常運行期間”、“可以拋出的”和“那些異常”。
其中,“在Java虛擬機的正常運行期間”指的是JVM正常運行期間,通俗來說就是應(yīng)用程序正常運行期間。“可以拋出的”指的是可以被throw的異常,只有Throwable及其子類才能被拋出,而RuntimeException就是Throwable的子類。
綜上所述,運行時異常就是在應(yīng)用程序運行期間拋出的異常。
這里我們再來一個例子感受一下。
演示:
請制造一個運行時異常。
請觀察程序代碼及結(jié)果。
代碼:
Main類:
結(jié)果:
我們先不著急看結(jié)果,先看程序代碼:
大家有什么發(fā)現(xiàn)沒有?
程序內(nèi)容是計算1除以0,但我們知道0不能被任何數(shù)除,所以程序運行到這里必定發(fā)生異常。既然會發(fā)生異常,為什么程序在運行前沒有強制我們使用try-catch或throws處理呢?
因為運行時異常是“未檢查的異常”,和“已檢查的異常”不同的是,未檢查的異常不需要強制try-catch和throws的,編譯期間也不對其進行檢查。所以上述程序代碼可以編譯通過,照常運行。
3.什么是檢查?這里小伙伴可能有疑問:“未檢查的異常”和“已檢查的異常”里面的“檢查”是什么意思?
檢查的意思就是看你對這些已檢查的異常有沒有進行try-catch或throws處理。
4.已檢查的異常那“未檢查的異常”和“已檢查的異常”分別是什么?
我們先來說說什么是已檢查的異常?已檢查的異常前面幾章學(xué)習(xí)過,這里簡單地來回顧一下,已檢查的異常就是應(yīng)用程序中可以預(yù)測和恢復(fù)的異常。
圖中紅色部分都是已檢查異常。
比如其中的FileNotFoundException(找不到文件異常):
當(dāng)發(fā)生FileNotFoundException異常時,我們可以對其try-catch處理,然后在catch代碼塊里面告知用戶文件路徑輸入有誤,請核對后再輸入:
類似于FileNotFoundException這樣的已檢查的異常有很多,它們旨在幫助我們完善用戶體驗,增強程序的健壯性。
5.預(yù)測與恢復(fù)“已檢查的異常就是應(yīng)用程序中可以預(yù)測和恢復(fù)的異常。”中的預(yù)測和恢復(fù)是什么意思?
預(yù)測:提前預(yù)知這里將會發(fā)生異常。
例如,這里可能發(fā)生文件不存在的情況:
恢復(fù):對其發(fā)生的異常采取措施(try-catch或throws),使其程序正常運行。
例如,我們對將來可能發(fā)生的異常進行處理:
6.未檢查的異常那什么是未檢查的異常呢?
對照已檢查的異常,未檢查的異常就是應(yīng)用程序中無法預(yù)測和恢復(fù)的異常。
圖中紅色部分都是未檢查異常。
Error及其子類和RuntimeException及其子類都是未檢查的異常。
未檢查異常有什么特殊之處嗎?
未檢查的異常在編譯時乃至在運行時,都不需要你強制使用try-catch或throws對其處理。
例如,我們的算術(shù)異常ArithmeticException,下面程序只有在運行時才會發(fā)生異常:
實際開發(fā)中,我們接觸到最多的未檢查的異常就是RuntimeException及其子類。例如:ClassCastException(類型轉(zhuǎn)換異常)和NullPointerException(空指針異常)。
7.RuntimeException接下來,我們來看看RuntimeException類和它的子類們。
RuntimeException是所有運行時異常的父類。
圖中紅色部分都是運行時異常。可以看到有我們熟悉的算術(shù)異常ArithmeticException和空指針異常NullPointerException。
RuntimeException繼承自Exception:
RuntimeException類里面的成員方法全部繼承自父類,一個自定義的成員方法都沒有,只有構(gòu)造方法是自定義的:
我們把注釋去掉再看看:
既然RuntimeException中的成員方法全部來自于父類,那么也就是說父類中的常用方法也就是我們RuntimeException中最常用的方法,之前在《“全棧2019”Java異常第十六章:Throwable詳解》、《“全棧2019”Java異常第十八章:Exception詳解》兩章中講解過它的父類Exception和Throwable常用方法,這里就不再贅述,請大家諒解。
拋出一個RuntimeException及其子類是我們實際開發(fā)中常用的做法,也是我們常常碰到的異常。比如ClassCastException(類型轉(zhuǎn)換異常)和NullPointerException(空指針異常)。
8.類型轉(zhuǎn)換異常ClassCastException將對象強制轉(zhuǎn)換為不是實例的子類就會發(fā)生類型轉(zhuǎn)換異常。
上面這句話什么意思?
下面結(jié)合例子來解釋說明。
演示:
請制造一個類型轉(zhuǎn)換異常。
請觀察程序代碼及結(jié)果。
代碼:
Main類:
結(jié)果:
錯誤信息:
文字版:
Exception in thread "main" java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String (java.lang.Integer and java.lang.String are in module java.ba of loader 'bootstrap')
at main.Main.main(Main.java:12)
我們先來看看程序代碼,首先,我們創(chuàng)建一個變量i:
這個變量i的引用類型是Object:
變量i的實際對象是new Integer(0),對象的類型是Integer:
下面我們將變量i轉(zhuǎn)換為String類型然后進行打印輸出:
就在這時,程序發(fā)生了類型轉(zhuǎn)換異常:
我們出錯的根本原因就是我們將對象的類型Integer轉(zhuǎn)換String,而Integer和String不是同一個類型,同一個類型指的是同一個類及其子類,什么意思?
比如,Integer類及其它下面的子類可以稱為同一類型。String類及其它下面的子類也可以稱為同一類型。但Integer和String不能稱為同一類型。
我們再來將“將對象強制轉(zhuǎn)換為不是實例的子類就會發(fā)生類型轉(zhuǎn)換異常。”這句話結(jié)合例子來看。
“將對象強制轉(zhuǎn)換為不是實例的子類”中的“對象”指的是new Integer(0):
“實例的子類”中的“實例”指的也是對象,也就是new Integer(0)。所以,“實例的子類”指的是Integer類及其子類。
綜上所述,“將對象強制轉(zhuǎn)換為不是實例的子類”這句話就是“將Integer強制轉(zhuǎn)換為不是Integer類及其子類”,所以就發(fā)生了類型轉(zhuǎn)換異常。
實際上,是不是這樣的呢?
實際上就是這樣的,我們將Integer轉(zhuǎn)換為了String,而String不是Integer類及其子類。
類型轉(zhuǎn)換異常在日常開發(fā)中很常見,希望大家把這個例子理解透徹,后面再解決類型轉(zhuǎn)換異常就游刃有余。
9.空指針異常NullPointerException當(dāng)使用的對象為null時就會拋出NullPointerException。
例如下面這些情況。
調(diào)用null對象的實例方法代碼:
結(jié)果:
訪問或修改null對象的字段代碼:
結(jié)果:
拋出的異常為null代碼:
結(jié)果:
還有很多觸發(fā)NullPointerException異常的情況,這里就不一一列舉了,但是它們都有一個共同的特征,那就是對象為null。
碰到NullPointerException該如何處理?
其實在實際開發(fā)中碰到NullPointerException,我們認(rèn)為這些都是編程錯誤,應(yīng)該手動排查錯誤,去修改。也就是說,不建議使用try-catch或者throws,建議手動查找出錯的地方,更正程序代碼。
好了,最后希望大家能夠在日后的編程過程中少一些異常,多一些收獲,謝謝大家的閱讀。
總結(jié)運行時異常是在Java虛擬機的正常運行期間可以拋出的那些異常。運行時異常就是在應(yīng)用程序運行期間拋出的異常。檢查的意思就是看你對這些已檢查的異常有沒有進行try-catch或throws處理。已檢查的異常就是應(yīng)用程序中可以預(yù)測和恢復(fù)的異常。未檢查的異常就是應(yīng)用程序中無法預(yù)測和恢復(fù)的異常。Error及其子類和RuntimeException及其子類都是未檢查的異常。未檢查的異常在編譯時乃至在運行時,都不需要你強制使用try-catch或throws對其處理。RuntimeException是所有運行時異常的父類。實際開發(fā)中,我們接觸到最多的未檢查的異常就是RuntimeException及其子類。例如:ClassCastException(類型轉(zhuǎn)換異常)和NullPointerException(空指針異常)。將對象強制轉(zhuǎn)換為不是實例的子類就會發(fā)生類型轉(zhuǎn)換異常。當(dāng)使用的對象為null時就會拋出NullPointerException。其實在實際開發(fā)中碰到NullPointerException,我們認(rèn)為這些都是編程錯誤,應(yīng)該手動排查錯誤,去修改。也就是說,不建議使用try-catch或者throws,建議手動查找出錯的地方,更正程序代碼。至此,Java中運行時異常RuntimeException相關(guān)內(nèi)容講解先告一段落,更多內(nèi)容請持續(xù)關(guān)注。
答疑如果大家有問題或想了解更多前沿技術(shù),請在下方留言或評論,我會為大家解答。
上一章“全棧2019”Java異常第十八章:Exception詳解
下一章“全棧2019”Java異常第二十章:自定義異常
學(xué)習(xí)小組加入同步學(xué)習(xí)小組,共同交流與進步。
方式一:關(guān)注頭條號Gorhaf,私信“Java學(xué)習(xí)小組”。方式二:關(guān)注公眾號Gorhaf,回復(fù)“Java學(xué)習(xí)小組”。全棧工程師學(xué)習(xí)計劃關(guān)注我們,加入“全棧工程師學(xué)習(xí)計劃”。
版權(quán)聲明原創(chuàng)不易,未經(jīng)允許不得轉(zhuǎn)載!
本文發(fā)布于:2023-02-28 20:58:00,感謝您對本站的認(rèn)可!
本文鏈接:http://www.newhan.cn/zhishi/a/167771184795027.html
版權(quán)聲明:本站內(nèi)容均來自互聯(lián)網(wǎng),僅供演示用,請勿用于商業(yè)和其他非法用途。如果侵犯了您的權(quán)益請與我們聯(lián)系,我們將在24小時內(nèi)刪除。
本文word下載地址:runtimeexception.doc
本文 PDF 下載地址:runtimeexception.pdf
| 留言與評論(共有 0 條評論) |