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