报错空指针异常_让你为之颤抖的Java常见的异常exception
對于一名Java程序員來說,exception再常見不過了。工作時,一天不見便渾身難受。當(dāng)然了,如果辛辛苦苦敲了一天的代碼,就要下班了,信心滿滿,代碼跑完收工。這個時候控制臺告訴你:.....................Exception..............,嘻嘻嘻。 本皮不才,特意留心了一些常見的異常,總結(jié)一下,跟大家嘮嘮。
1、NullPointerException
它叫空指針異常,基本上操作一個 為空的對象的方法或?qū)傩詴r會拋出這個異常。當(dāng)一個變量的值為 null 時,在 Java 不會給它分配內(nèi)存,null 也是對象成員變量的默認(rèn)值。所以,一個對象如果沒有進(jìn)行初始化操作,這時候,如果你調(diào)用這個對象的方法或者變量,就會出現(xiàn)空指針異常。阿里云開發(fā)手冊中有這樣的說法:Java 類庫中定義的一類 RuntimeException 可以通過預(yù)先檢查進(jìn)行規(guī)避,而不應(yīng)通過 catch 來處理,比如:IndexOutOfBoundsException,NullPointerException 等等。也就是說,這種異常是可以避免在處理可能存在空指針異常等異常情況時,可以不通過catch,而是邏輯代碼編寫者通過判斷來規(guī)避。另外,斷言也是可以用來檢查程序的安全性的,在使用之前進(jìn)行檢查條件,如果不符合條件就報(bào)異常,符合就繼續(xù)。
2、IOException
IO異常。IO,即:input, output,java內(nèi)部數(shù)據(jù)的傳輸都是通過流,或者byte來進(jìn)行傳遞的。通常我們在讀寫磁盤文件、網(wǎng)絡(luò)內(nèi)容的時候會發(fā)生的一種異常,這種異常是受檢查異常,需要進(jìn)行手工捕獲。要處理這些異常,有兩種處理方法:要么直接try-catch,要么使用throws拋出可能發(fā)生的異常。類庫的程序員編寫方法時使用了throws拋出了可能產(chǎn)生的異常,將具體的處理方法交給了你,因?yàn)槟愦藭r調(diào)用了這個方法,但你此時不想處理可以繼續(xù)拋出,拋出后到其它調(diào)用此方法的地方去捕獲,如果后面你仍然沒有處理,那么最終將交給系統(tǒng)處理。
3、ClassCastException
類轉(zhuǎn)換異常,將一個不是該類的實(shí)例轉(zhuǎn)換成這個類就會拋出這個異常。經(jīng)常這兩種原因:1.一個類是數(shù)字類,而由于誤操作,錯誤的將數(shù)字類向數(shù)字類轉(zhuǎn)換改寫成了數(shù)字類向字符串類的轉(zhuǎn)換,從而產(chǎn)生了異常。2.大部分原因是因?yàn)閺?qiáng)制轉(zhuǎn)換或者是SQL映射時發(fā)生了這個異常。這是運(yùn)行時異常,不需要手工捕獲。
如下,將一個數(shù)字強(qiáng)制轉(zhuǎn)換成字符串就會報(bào)這個異常:
Object object = new Integer(0);
String string = (String)object;
4、SQLException
SQL異常,通常發(fā)生在操作數(shù)據(jù)庫時的異常。上到數(shù)據(jù)庫連接,下到sql語句錯誤或者數(shù)據(jù)庫表中的變量和實(shí)體類映射不符(尤其是數(shù)據(jù)類型)等情況,只有想不到?jīng)]有錯不到。然鵝,仔細(xì)閱讀 SQLException 的異常信息,會幫助我們更好的定位錯誤。
5、IndexOutOfBoundsException
索引越界異常,當(dāng)操作一個字符串或者數(shù)組的時候經(jīng)常遇到的異常。同屬于RunTimeException,它常見的形式有StringIndexOutOfBoundsException和ArrayIndexOutOfBoundsException,即字符串長度越界和數(shù)組越界,通俗說就是我寫的代碼以為我的字符串或數(shù)組有那么長,還用了相應(yīng)的操作,但他其實(shí)沒那么長。它是運(yùn)行時異常,不需要手工捕獲。
6、ClassNotFoundException
類找不到異常,這是在加載類的時候拋出來的,即在類路徑下不能加載指定的類。你看這個類它又大又圓,就像這個異常它......
它是受檢查異常,需要進(jìn)行手工捕獲。
7、OutOfMemoryError
內(nèi)存異常,這一般不是程序能控制的,是指要分配的對象的內(nèi)存超出了當(dāng)前最大的堆內(nèi)存,需要調(diào)整堆內(nèi)存大小(-Xmx)以及優(yōu)化程序。當(dāng)然,需要重點(diǎn)排查以下幾點(diǎn):
檢查代碼中是否有死循環(huán)或遞歸調(diào)用。檢查是否有大循環(huán)重復(fù)產(chǎn)生新對象實(shí)體。檢查對數(shù)據(jù)庫查詢中,是否有一次獲得全部數(shù)據(jù)的查詢。一般來說,如果一次取十萬條記錄到內(nèi)存,就可能引起內(nèi)存溢出。這個問題比較隱蔽,在上線前,數(shù)據(jù)庫中數(shù)據(jù)較少,不容易出問題,上線后,數(shù)據(jù)庫中數(shù)據(jù)多了,一次查詢就有可能引起內(nèi)存溢出。因此對于數(shù)據(jù)庫查詢盡量采用分頁的方式查詢。(吃過這種虧的不想多說)檢查List、MAP等集合對象是否有使用完后,未清除的問題。List、Map等集合對象會始終存有對對象的引用,使得這些對象不能被GC回收。
8、FileNotFoundException
文件找不到異常,如果文件不存在就會拋出這種異常。如定義輸入輸出文件流,文件不存在會報(bào)錯。FileNotFoundException 其實(shí)是 IOException 的子類,同樣是受檢查異常,需要進(jìn)行手工捕獲。
我自己是一名從事了多年開發(fā)的JAVA老程序員,今年年初我花了一個月整理了一份最適合2019年學(xué)習(xí)的java學(xué)習(xí)干貨,可以送給每一位喜歡java的小伙伴,想要獲取的可以關(guān)注我的頭條號并在后臺私信我:java,即可免費(fèi)獲取。
本文轉(zhuǎn)載至知乎——一只咩,如有侵權(quán)請聯(lián)系立刪!
總結(jié)
以上是生活随笔為你收集整理的报错空指针异常_让你为之颤抖的Java常见的异常exception的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微博 用户画像_“肖战”被抵制?Pyth
- 下一篇: 快讯丨大秦数能完成数十亿元 B、C 轮融