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