2013-04-14 64 views
4

如果我有一個叫船類的,如果我寫:優勢聲明異常

class Boat throws Exception 

裏面我的課,我使用try catch塊捕捉ArithmeticException例如。 有什麼好處是宣佈一個異常與不宣佈異常?

+1

請參閱[this](http://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html)。 – m0skit0

+4

'class'不會拋出異常。只有方法。 – Thilo

回答

2

第一類不會拋出異常,只有方法將拋出

檢查本例中

class A 
{ 
public A() throws Exception 
{ 
int k=5/0; 
} 

} 

public class B 
{ 
public static void main(String[] args) 
{ 
A a=new A(); 
} 
} 

當你運行上面的你會得到編譯時錯誤說

Unhandled exception type Exception 

因爲當方法拋出異常時,它們需要通過調用對象來處理,就像是在說'嘿有人處理異常',所以調用它的方法應該ndle異常,如果他們不這將是一個編譯時錯誤。

爲了順利執行程序,方法拋出的異常應該通過調用方法來處理。這是你需要處理的方式。

class A 
{ 
public A() throws Exception 
{ 
int k=5/0; 
} 

} 

public class B 
{ 
public static void main(String[] args) 
{ 
try{ 
A a=new A(); 
} 
catch(Exception e) 
{ 
System.out.println("caught "+e); 
} 

} 
} 
+0

因此,聲明方法的異常的唯一好處是允許使用該方法的另一個類捕獲異常?請告訴我。 – Stranger

+1

@Stranger通過拋出你指定的異常,你的方法將拋出下面的異常。它只是說,當你使用這種方法時,它會拋出以下異常,你需要去處理它們。例如:'Class.forName(str)'將拋出CNF異常來指定使用此方法將導致CNF異常檢查方法聲明http://docs.oracle.com/javase/1.4.2/docs/api/java/ lang/Class.html#forName%28java.lang.String%29 – Pragnani

+1

「以允許使用該方法的另一個類捕獲異常」。更喜歡強迫另一個類去思考如何處理異常(捕獲或傳播)。 – Thilo

2

聲明異常將允許您的程序編譯,如果任何異常可以由編譯器確定「逃脫」。不過,它的主要目的是向你的方法的用戶(以及它們的編譯器)記錄它可能拋出異常。

因此,宣佈異常,vs宣佈更具體的異常原因,是取消該計劃的好處 - 作弊。

3
  • A class不會拋出異常。只有方法。

  • 對於一些異常(檢查可能出現在您的代碼中的異常,您無法捕獲),編譯器會強制您聲明它們。

  • 你永遠不必聲明RuntimeExceptions(例如ArithmeticException),但你可以。這用作文檔。

  • 您可以聲明您的代碼不會拋出的已檢查異常。如果你以後想要拋出它們,這就使得它具有面向未來的可能性,並且也允許子類這樣做。

  • 當聲明異常時,可以使用廣義/通用(throws Exception或甚至throws Throwable),但通常更好的是更具體。這給了人們使用你的代碼更好的想法。擁有這些許多特定的Exception類的全部目的是爲了更容易地處理異常(並且讓編譯器強制實施某人至少考慮過這樣做的事實)。

2

如果你寫類似的東西,

double x = 1/0; 
System.out.print("hey"); 

它會給你一個例外,你的代碼將停止,將無法打印。但如果你用try/catch封裝它,它不會停止。

try{ 
    double x = 1/0; 
}catch(ArithmeticException){} 
System.out.print("hey"); 

這將打印