Java提供了兩類主要的異常:runtime exception和checked exception。checked 異常也就是我們經(jīng)常遇到的IO異常,以及SQL異常都是這種異常。對于這種異常,JAVA編譯器強(qiáng)制要求我們必需對出現(xiàn)的這些異常進(jìn)行catch。所以,面對這種異常不管我們是否愿意,只能自己去寫一大堆catch塊去處理可能的異常。 但是另外一種異常:runtime exception,也稱運(yùn)行時異常,我們可以不處理。當(dāng)出現(xiàn)這樣的異常時,總是由虛擬機(jī)接管。比如:我們從來沒有人去處理過NullPointerException異常,它就是運(yùn)行時異常,并且這種異常還是最常見的異常之一。 出現(xiàn)運(yùn)行時異常后,系統(tǒng)會把異常一直往上層拋,一直遇到處理代碼。如果沒有處理塊,到最上層,如果是多線程就由Thread.run()拋出,如果是單線程就被main()拋出。拋出之后,如果是線程,這個線程也就退出了。如果是主程序拋出的異常,那么這整個程序也就退出了。運(yùn)行時異常是Exception的子類,也有一般異常的特點,是可以被Catch塊處理的。只不過往往我們不對他處理罷了。也就是說,你如果不對運(yùn)行時異常進(jìn)行處理,那么出現(xiàn)運(yùn)行時異常之后,要么是線程中止,要么是主程序終止。 如果不想終止,則必須撲捉所有的運(yùn)行時異常,決不讓這個處理線程退出。隊列里面出現(xiàn)異常數(shù)據(jù)了,正常的處理應(yīng)該是把異常數(shù)據(jù)舍棄,然后記錄日志。不應(yīng)該由于異常數(shù)據(jù)而影響下面對正常數(shù)據(jù)的處理。在這個場景這樣處理可能是一個比較好的應(yīng)用,但并不代表在所有的場景你都應(yīng)該如此。如果在其它場景,遇到了一些錯誤,如果退出程序比較好,這時你就可以不太理會運(yùn)行時異常,或者是通過對異常的處理顯式的控制程序退出