java中的異常

異常

爲何處理異常

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;
	}
}

try-catch能控制變量的消亡,因此儘可能把變量的定義放在try-catch外邊,try裏面只進行賦值操做

public static int getLuckeyNum(){//try-catch語句中能消亡變量,應該先把變量定義在try外部,在try中只進行賦值操做
		int num=0;
		try{
			num=(int)(Math.random()*5);
		}catch(Exception e){}
		return num;
}

連壞try操做:當一個語句拋出異常後面的語句依然能正常執行(finally嵌套try-catch)

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替代傳統的分支和判斷

//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方法");
	}
}
相關文章
相關標籤/搜索