a-非運行時異常必須在運行前(編譯時)給出解決方案,不然沒法繼續運行java
b-一旦程序運行中出現異常,程序員沒有處理,程序就會中斷執行程序員
throws(能解決a、不能解決b)dom
try{ 出現異常的語句,通常只要出異常的那一句 }catch(捕獲的異常){ //能夠有多個catch語句,但要保證從"上往下平級或逐漸變大" ,JDK7.0開始出現多個分支時能夠用 | 隔開 // 處理方式1:不處理,空 // 處理方式2:簡單打印 e.getMessage() // 處理方式3:詳細處理 e.printStackTrace(); }finally{ //不管有沒有異常都要走這一步 //finally當中永遠不該該出現return語句,不然我們try和catch當中的return就都失去做用了 //在try(異常出現前)和catch中用System.exit(int)可跳過finally }
throw 用在方法體當中 在本沒有異常的狀況下
主動製造異常出現的狀況 [沒事找事型]ide
public class Test1{ public static void main(String[] args)throws Exception{ getInfo(); } public static void getInfo()throws Exception{ throw new Exception("哎呀,我出現異常了"); } }
throws 用在方法簽名的最後 表達的是 本方法中出現指定種類的異常
方法當中不作處理 拋還給調用的上級進行處理 [有事甩鍋型]code
public class Test1{ public static void main(String[] args)throws MyException{ getInfo(); } public static void getInfo()throws MyException{ throw new MyException(); } } class MyException extends Exception{ public MyException(){ super("哎呀我出現自定義的異常了"); } }
class A{//擴展1:當靜態變量使用可能有異常的靜態方法時,可用靜態代碼塊進行異常捕獲 static int num; static{ try{ num=getNum(); }catch(Exception e){ e.printStackTrace(); } } public static int getNum()throws Exception{ int num=(int)(Math.random()*5); if(num%2==0) throw new Exception("這個數字不吉利"); return num; } }
public static int getLuckeyNum(){//try-catch語句中能消亡變量,應該先把變量定義在try外部,在try中只進行賦值操做 int num=0; try{ num=(int)(Math.random()*5); }catch(Exception e){} return num; }
public class Exec5{ public static void main(String[] args){ SLT s1=new SLT(); SLT s2=new SLT(); SLT s3=new SLT(); try{ s1.close(); }catch(Exception e){ System.out.println(e.getMessage()); //e.printStackTrace(); return; }finally{ try{ s2.close(); }catch(Exception e){ System.out.println(e.getMessage()); //e.printStackTrace(); return; }finally{ try{ s3.close(); }catch(Exception e){ //e.printStackTrace(); System.out.println(e.getMessage()); return; } } } } } class SLT{ public void close()throws Exception{ int num=(int)(Math.random()*2); if(num==0) throw new Exception("水龍頭擰壞了"); System.out.println("水龍頭已經成功關閉了"); } }
//try-catch代替if判斷 public static boolean isNumber(String str){ try{ Integer.parseInt(str); return true; }catch(Exception e){ return false; } }
你要明白 其實這裏的異常指的是 非運行時異常
全部的運行時異常 默認都被拋出
Java當中每個方法至關於都有一行throws RuntimeException
若是壞蛋問你:
父類的方法沒有異常聲明 子類在覆蓋這個方法的時候 能拋異常嗎?
能 可是隻能聲明拋出各類運行時異常,而這樣的行爲是沒有意義的 ,由於每一個方法默認就拋出全部運行會異常blog
class A{ public void get(){//每一個方法後滿默認是 throws RuntimeException() System.out.println("這是父類的get方法"); } } class B extends A{ @Override public void get() throws NullPointerException,IndexOutOfBoundsException{//這裏能夠拋運行時異常的子類 System.out.println("這是子類的get方法"); } }