天天看點

異常

運作時異常與一般異常有何異同?

Java提供了兩類主要的異常:runtime exception和checked exception。checked 異常也就是我們經常遇到的IO異常,以及SQL異常都是這種異常。對于這種異常,JAVA編譯器強制要求我們必需對出現的這些異常進行catch。是以,面對這種異常不管我們是否願意,隻能自己去寫一大堆catch塊去處理可能的異常。

但是另外一種異常:runtime exception,也稱運作時異常,我們可以不處理。當出現這樣的異常時,總是由虛拟機接管。比如:我們從來沒有人去處理過NullPointerException異常,它就是運作時異常,并且這種異常還是最常見的異常之一。

出現運作時異常後,系統會把異常一直往上層抛,一直遇到處理代碼。如果沒有處理塊,到最上層,如果是多線程就由Thread.run()抛出,如果是單線程就被main()抛出。抛出之後,如果是線程,這個線程也就退出了。如果是主程式抛出的異常,那麼這整個程式也就退出了。運作時異常是Exception的子類,也有一般異常的特點,是可以被Catch塊處理的。隻不過往往我們不對他處理罷了。也就是說,你如果不對運作時異常進行處理,那麼出現運作時異常之後,要麼是線程中止,要麼是主程式終止。

如果不想終止,則必須撲捉所有的運作時異常,決不讓這個處理線程退出。隊列裡面出現異常資料了,正常的處理應該是把異常資料舍棄,然後記錄日志。不應該由于異常資料而影響下面對正常資料的處理。在這個場景這樣處理可能是一個比較好的應用,但并不代表在所有的場景你都應該如此。如果在其它場景,遇到了一些錯誤,如果退出程式比較好,這時你就可以不太理會運作時異常,或者是通過對異常的處理顯式的控制程式退出。

也就是說有時候調用的方法沒有throws Exception時,也有可能往上抛異常,因為它是運作時異常。

package cheshi;

public class ExceptionTest {
    public static void main(String[] args) {             
        Count c = new Count();
        try {
            Integer x = c.count();
            System.out.println(x);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

      
package cheshi;

public class Count {
    public Integer count() {
            Integer i = 10/0;
            return i;
    }
}