先說幾句題外話,爲什麼會想到開始寫博客呢。主要原因還是受打擊了。
上週五去搜狐面試,問了一些基礎問題,因爲好久都沒用用到基礎知識,一時回答不出來,面試官跟我說,不管後面學的如何,基礎一定要過硬。所以,回來就回顧了一下基礎知識,順便把最近回顧的,做個總結,以方便以後查看。
----------------------------------------------------------------------------------------------------------------------
異常分類:
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>
以上是異常的分類以及常見的一些異常及特例,下一篇介紹一下異常的兩種處理方法。