throws是用來(lái)聲明一個(gè)方法可能拋出的所有異常信息
throw則是指拋出的一個(gè)具體的異常類(lèi)型。
通常在一個(gè)方法(類(lèi))的聲明處通過(guò)throws聲明方法(類(lèi))可能拋出的異常信息,而在方法(類(lèi))內部通過(guò)throw聲明一個(gè)具體的異常信息。
throws通常不用顯示的捕獲異常,可由系統自動(dòng)將所有捕獲的異常信息拋給上級方法;
throw則需要用戶(hù)自己捕獲相關(guān)的異常,而后在對其進(jìn)行相關(guān)包裝,最后再將包裝后的異常信息拋出。
對異常處理方式不同.throws對異常不處理,誰(shuí)調用誰(shuí)處理,throws的Exception的取值范圍要大于方法內部異常的最大范圍,而cathch的范圍又要大于throws的Exception的范圍;throw 主動(dòng)拋出自定義異常類(lèi)對象. throws拋出的是類(lèi),throw拋出的是對象.
在方法定義中表示的是陳述語(yǔ)氣,第三人稱(chēng)單數,throw 顯然要加s。(throws 一般用作方法定義的子句)
在函數體中要用throw,實(shí)際上是祈使句+強調,等價(jià)于DO throw ....,do +動(dòng)詞原形
throw 用于引發(fā)異常,可引發(fā)預定義異常和自定義異常。
I)異常中“throws”和“throw”的區別:
throw 是個(gè)“動(dòng)詞”,緊接在try語(yǔ)句塊之后。
而throws 是“名詞” ,用在函數方法名后 function A () throws Exception e {}
throw用在程序中明確表示這里拋出一個(gè)異常。throws用在方法聲明的地方,表示這個(gè)方法可能會(huì )拋出某異常。
throw用來(lái)拋出實(shí)際的異常, 后面要跟一個(gè)異常對象(實(shí)例), 是一個(gè)實(shí)際的語(yǔ)句
throws是用來(lái)聲明的, 加在方法聲明的后面, 后面跟一個(gè)異常類(lèi)的名字, 表示一般性動(dòng)作而不是特指某一個(gè)動(dòng)作.
使用throws是來(lái)說(shuō)明,當前的函數會(huì )拋出一個(gè)異常。
在一般的情況下,你調用的一些函數會(huì )拋出一些異常。但是你又不想在當前的context中去處理它,就可以聲明該函數會(huì )拋出該異常,這樣你就不用去try-catch它了。當出現該異常,該函數會(huì )拋出此異常,讓上一層的函數去處理。throws也稱(chēng)異常規范
public static h() throws
{
try
{
a.g();
}
catch(Exception e)
{
throw e;
}
}
因為你沒(méi)有對這個(gè)異常處理,而是簡(jiǎn)單的拋出了。
而單純的聲明
public static h() throws
{
a.g();
}
也會(huì )拋出這個(gè)異常
II)try catch \throws \throw
throws如果發(fā)生了對應的錯誤后,下邊的的確不會(huì )被執行;
try catch的理解應該辯證點(diǎn)看:如果catch后沒(méi)有再次throw出去,那會(huì )繼續執行;要想不執行必須throw處理
throws 拋出異常,解決不了再向上,直道碰到能解決這個(gè)異常的處理程序,就好像你的上司讓你執行一項任務(wù),中途你遇到問(wèn)題不知道如何解決,你把問(wèn)題返還給你的上司,認為既然是T分配的任務(wù)就該知道如何解決這個(gè)問(wèn)題,你的上司無(wú)法解決同樣把它送給經(jīng)理解決,依次向上,直到有人能解決這個(gè)問(wèn)題為止(不想自己另外寫(xiě)代碼處理異常時(shí)非常有用)
try catch 則是考慮到try包含這段代碼可能會(huì )遇到這種異常,直接用catch捕獲處理,catch包含的代碼為處理代碼
throws 只是把一個(gè)異常拋出去了,如果你的上層代碼有處理方式,就由上層代碼來(lái)處理這個(gè)異常。
而try/catch對是清楚的知道該操作可能出現什么異常,同時(shí)在catch塊中應該有處理的方法。
而且還有一種方式就是try/catch/finaly的方式。
Throws是把異常返回給調用者,由調用者處理,調用者還是要try/catch,跑不掉的
catch中就一個(gè)簡(jiǎn)單的SYSTEM.OUT.PRINTLN(…………);還有,連接數據庫時(shí)會(huì )連接不上,你也不知道是驅動(dòng)問(wèn)題、電腦問(wèn)題還是網(wǎng)絡(luò )問(wèn)題,發(fā)給用戶(hù),用戶(hù)也看不懂,所以統統throws給catch,提示請與管理員聯(lián)系。。。。。。這就簡(jiǎn)單多了
throws 寫(xiě)在方法簽名后,
throw 寫(xiě)在方法體內,可以寫(xiě)在if()....
也可以catch住一個(gè)exception后立刻又把他throw 出去,什么處理也不做,還可以catch住后throw new 一個(gè)你自己定義的exception ....
throws 就是把異常拋出,但是在以后要不有個(gè)catch接受,要不就拋給主函數.就是逐級往上一級拋,直到有一個(gè)接受他的
Throws拋出異常交給調用該方法的方法 處理,即:
public class Test{
public static void main(String[] args){
Test2 test2 = new Test2();
try{
System.out.println("invoke the method begin!");
test2.method();
System.out.println("invoke the method end!");
}catch(Exception e){
System.out.println("catch Exception!");
}
}
}
class Test2{
public void method() throws Exception{
System.out.println("method begin!");
int a = 10;
int b = 0;
int c = a/b;
System.out.println("method end!");
}
}
很明顯,答案出來(lái)了:
invoke the method begin!
method begin!
catch Exception!
finally語(yǔ)句是任選的,try語(yǔ)句后至少要有一個(gè)catch或一個(gè)finally,finally語(yǔ)句為異常處理提供一個(gè)統一的出口,不論try代碼塊是否發(fā)生了異常事件,finally塊中的語(yǔ)句都會(huì )被執行
在覆蓋的方法中聲明異常
在子類(lèi)中,如果要覆蓋父類(lèi)的一個(gè)方法,或父類(lèi)中的方法聲明了throws異常,則子類(lèi)的方法也可以?huà)伋霎惓?,但切記子?lèi)方法拋出的異常只能是父類(lèi)方法拋出的異常的同類(lèi)或子類(lèi)。
如:
import java.io.*;
class A {
public void methodA()throws IOException{
.....
}
}
class B1 extends A {
public void methodA()throws FileNotFoundException{
....}
}
class B2 extends A {
public void methodA()throws Exception{//Error
....}
}
public void method() throws Exception {
try {
具體程序
} catch(Exception ex) {
}
}
如果具體程序出錯的話(huà),將處理下面程序體中catch的地方,這個(gè)時(shí)候throws Exception 其實(shí)是沒(méi)有意義的。
public void method() throws Exception {
try {
具體程序
} catch(FileNotFoundException ex) {
}
}
如果具體程序出錯的話(huà),且是FileNotFoundException 的情況下,將處理下面程序體中catch的地方處理。
這個(gè)時(shí)候FileNotFoundException 以外的Exception 將通過(guò) throws Exception ,throw到上一層。
throw寫(xiě)在方法體內, throws寫(xiě)在方法名的后面
throw關(guān)鍵字的格式:throw new ArithmeticException(); 拋出一個(gè)異常,這些異??梢允箄nchecked exception(也就是RuntimeException),也可以是checked execption. throw必須有一個(gè)捕獲該異常的try/catch語(yǔ)句
throws關(guān)鍵字的格式
private void arrayMethod(int[] arr)
throws ArrayIndexOutOfBoundsException,
ArithmeticException {
// Body
}
throws子句列出了方法可能拋出的異常類(lèi)型,除了Error和RuntimeException異常,方法中可能拋出的異常必須在throws列表中聲明,否則就會(huì )出現編譯錯誤。
例如:假如方法中可能拋出IllegalAccessException(屬于checked execption)則必須在throws列表中聲明。
系統異常是默認拋出的,自己定義的異常要顯示拋出
還有一些是庫方法只throw 沒(méi)有處理的,所以表面上你看到?jīng)]有throw也catch到異常