Exception:異常分類

先說幾句題外話,爲什麼會想到開始寫博客呢。主要原因還是受打擊了。

上週五去搜狐面試,問了一些基礎問題,因爲好久都沒用用到基礎知識,一時回答不出來,面試官跟我說,不管後面學的如何,基礎一定要過硬。所以,回來就回顧了一下基礎知識,順便把最近回顧的,做個總結,以方便以後查看。

----------------------------------------------------------------------------------------------------------------------

異常分類:

1.嚴重異常:Error

2.運行時異常

3.編譯時異常


嚴重異常:Error

一般這樣的異常,是用代碼不能去處理的,比如內存溢出,我們只能增加內存,但是不能通過代碼去增加,所以這樣的異常,我們一般不作處理。


運行時異常:RuntimeException

運行時異常,就是在程序執行的過程中遇到問題,jvm自動幫我們去作出處理。出現這樣的異常,主要原因是我們書寫不規範,或者說是一時大意造成的異常。我大概列舉一下我常見到的運行時異常的種類。

1.NullPointException   -->  空指針異常

這個異常我相信是見得最多的,但也是最好解決的一個異常。主要意思就是在某個地方,操作某個對象時,發現對象時空的,最常見的是傳參問題,當然在後面的Springmvc中也長見到,比如Service層出現 aaaService爲空。舉個簡單例子說明一下這個異常:

<span style="font-size:18px;">public class NullPointExceptionDemo {
	public static void main(String[] args) {
		Integer result = fun(null);
		System.out.println(result);
	}
	
	public static Integer fun(Integer a){
		Integer result = null;
		result = a.intValue();
		return result;
	}
}</span>

當a爲空的時候,調用Integer的某個方法,就會提示空指針異常。

2.ClassCastException  --> 類型轉換異常

這個異常主要是類型轉換出錯,當你創建一個Object的集合是,在其中添加了一個String對象,當你需要接受一個Integer類的時候,卻傳來的是String類,而String類型是不能直接用Integer去接受並強轉的。因爲集合是Object類型,所以可以往集合中添加任何類型的元素。舉個例子:

<span style="font-size:18px;">public class ClassCastExceptionDemo {
	public static void main(String[] args) {
		List<Object> objList = new ArrayList<Object>(); 
		objList.add("abc");
		Integer result = (Integer) objList.get(0);
		System.out.println(result);
	}
}</span>

3.IndexOutofBoundsException  -->  數組越界異常

這個異常很好理解,數組長度是固定的,當長度超出範圍後,就會出現這樣的異常。

<span style="font-size:18px;">public class IndexOutOfBoundsExceptionDemo {
	public static void main(String[] args) {
		String[] str = new String[2];
		str[0] = "abc";
		str[1] = "bcd";
		str[2] = "cde";
		for (String string : str) {
			System.out.println(string);
		}
	}
}</span>
4.IllegalArgumentException  -->  非法參數異常

這個異常在基礎部分很少見到,在web開發中經常會出現這樣的異常。代碼比較多,後期遇到我再補充。

今天學習回顧線程的時候,正好遇到了這個異常,順便把這兒補充了。

線程有一個優先級的設置,Thread setPriority(int i)。這個優先級,默認情況下大小是5,可以設置的範圍,看源碼,是1-10,所以,如果在這兒設置一個大於10或者小於1的數值,將會出現這個非法參數異常。

下面是線程setPriority源碼:

    public final void setPriority(int newPriority) {
        ThreadGroup g;
        checkAccess();
        if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) {
            throw new IllegalArgumentException();
        }
        if((g = getThreadGroup()) != null) {
            if (newPriority > g.getMaxPriority()) {
                newPriority = g.getMaxPriority();
            }
            setPriority0(priority = newPriority);
        }
    }
現在做個小測試:

public class ThreadPriority extends Thread {
	@Override
	public void run() {
		for(int i=0;i<100;i++){
			System.out.println(getName()+"-----"+i);
		}
	}
	
	public static void main(String[] args) {
		ThreadPriority tp1 = new ThreadPriority();
		ThreadPriority tp2 = new ThreadPriority();
		ThreadPriority tp3 = new ThreadPriority();
		
		tp1.setPriority(100);
		tp1.setPriority(1);
		tp1.setPriority(2);

		tp1.start();
		tp2.start();
		tp3.start();
	}
}
輸出結果:

Exception in thread "main" java.lang.IllegalArgumentException
	at java.lang.Thread.setPriority(Thread.java:1086)
	at thread_1.ThreadPriority.main(ThreadPriority.java:16)

編譯時異常:

非運行時異常的異常爲編譯時。這樣的異常,是需要在編譯前要捕獲的,如果不捕獲,則不能通過編譯。常見的編譯時異常主要是IOException和ParseException

IOException:


ParseException

這個異常主要是解析時出現的異常。最有力的例子是String和Date互換時要捕獲的。

<span style="font-size:18px;">public class NullPointExceptionDemo {
	public static void main(String[] args) {
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String date = "2015-11-24"; 
		try {
			Date parseDate = df.parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}
}</span>

以上是異常的分類以及常見的一些異常及特例,下一篇介紹一下異常的兩種處理方法。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章