java中int和integer的区别_Java异常中throw和throws关键字的区别
Java中常常弄混的兩個關(guān)鍵字,throw和throws,它們有什么區(qū)別呢?如何記憶他們,而不至于出錯呢?
throw和throws
區(qū)別
throws:出現(xiàn)在方法的簽名中,聲明當(dāng)前方法可能拋出的所有異常,語法格式如下:
throws Exception1, Exception2, ...throw:可以出現(xiàn)在任何代碼塊中,是一個動作,拋出某個異常,語法格式如下:
throw new Exception();我們可以發(fā)現(xiàn),throws在聲明可能拋出的異常的時候,后邊跟的是異常類,可以可以跟多個異常類,每個類用逗號隔開;而throw在"拋出"(動作)一個異常的時候,后邊跟著的是某個異常的實例(對象),并且只能拋出一個實例,這是因為拋出一個異常后,后邊的異常都必定是不可達(dá)的,所以拋出多個異常時沒有意義的。
簡單的例子
為什么要有兩個throw(s)呢?
這和java的異常機制有關(guān),對于受檢(Checked)異常,有兩種選擇:1)在異常拋出的地方進(jìn)行捕獲(catch);2)如果本地處理不了,可以選擇向上拋出,那么,在方法簽名后邊的throws Exception就表示該方法體內(nèi)的Exception暫時處理不了,需要拋到方法外,讓其他方法去捕獲和處理。
如上簡單的例子所示,如果main方法也不知道如何處理這種類型的異常,也可以使用throws聲明拋出異常,該異常將交給JVM處理。
JVM對異常的處理方法是,打印異常的跟蹤棧信息,并中止程序運行。
利用IDE(IntelliJ IDEA)的提示功能,我們可以很清晰地看到這一點。
方法中沒有throw異常的情況
1)對于方法中沒有throw異常,或者異常已經(jīng)在方法體內(nèi)catch,這時throws聲明拋出異常,對于使用該方法的外部方法,仍然是需要catch該異常的。這是有意義的,雖然實際是不可能由異常拋出,但是對于像不能輕易改動的類庫或者接口,預(yù)先聲明可能拋出的異常,可以在未來實際加上,而且不對現(xiàn)有的客戶代碼帶來影響;(大家可以思考下,如果類庫開發(fā)者,隨意加上throws,對我們使用者來說,有什么影響)
方法中throw的異常沒有在原地捕獲
2)對于方法中throw的異常沒有在原地進(jìn)行捕獲(catch),這將會是語法錯誤,Unhandled exception,未處理的異常。編譯器禁止該代碼編譯。這是非常聰明的做法,因為如果此時不聲明throws拋出的異常,那么外部方法按語法來說,也可以不catch該異常,就這樣一級一級向上拋,直到程序中止。
RumtimeException就是這樣的異常,和受檢(Checked)異常不同,該類型異常表示運行時異常,是被認(rèn)為不可恢復(fù)的異常,不需要throws,直接程序中止,讓程序員及時修改bug。
如何記憶呢?
對于現(xiàn)在使用IDE的聯(lián)想功能,一般都不會出錯,但是如果面試遇到這個問題,就會懵逼了。我總結(jié)下來,凡是在聲明處的“動詞”關(guān)鍵字,都是單數(shù)的throws,例如,extends,implements.
如果我的文章對你有幫助,請關(guān)注我,點個贊,謝謝~
總結(jié)
以上是生活随笔為你收集整理的java中int和integer的区别_Java异常中throw和throws关键字的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: keras cnn注意力机制_从发展历史
- 下一篇: qtablewidget设置选中一行_W