2017-04-05 73 views
0

我有一個關於java.lang.Exception的問題以及它在throw/throws子句中的考慮方式。異常 - 已選中或未選中的異常類型

我有以下2個例子,我不明白如何處理java.lang.Exception:作爲選中或未選中的異常。

下面的方法成功編譯:

public double method1() throws Exception { 
    return 0.7; 
} 
  • 在這裏,在我看來,該java.lang.Exception的是威脅 了java.lang.RuntimeExceptionjava.lang.Error的。即使你沒有處理它,你也可以聲明拋出它。
  • 如果不是異常,我們使用了一個檢查的異常(這是java.lang.Exception的子類),那麼你應該必須在方法體內有一個throw聲明(或者調用拋出的方法那個檢查異常)。對?

以下不會編譯:

private void method2(int age) { 
    if (age > 30) 
     throw new Exception(); 
} 
  • 這裏是我的困惑......如果它被扔類型了java.lang.RuntimeExceptionjava.lang中的子類。它會編譯錯誤
  • 爲什麼在這種情況下它不能編譯?我想這是因爲它威脅java.lang.Exception作爲檢查的異常。但如果是這樣,那麼爲什麼method1會編譯?

謝謝 路易莎

+0

可能重複[Java:checked vs unchecked exception explanation](http://stackoverflow.com/questions/6115896/java-checked-vs-unchecked-exception-explanation) – Burkhard

回答

1

如果它被扔類型了java.lang.RuntimeException或 的子類java.lang.Error的會編過?

是,RuntimeException是未經檢查的異常(或Error),所以你不需要聲明它的方法簽名或catch它明確。就像例如NullPointerException一樣,你不能分辨出Runtime中的代碼何時會發生(也就是說,因爲哪個問題,所以你不需要在代碼中的任何地方明確地處理它),如果它由於任何原因在運行時發生,您將看到異常堆棧跟蹤。

但是,有一點是,你可以catch(如果你想)RuntimeException(使用catch),並處理它,如果你想以不同的方式在提高該異常處理的事情,你可以看看下面這一點。

try { 
    //some code 
} catch(ArithmeticException exe) { 
    //handle it and you can do things differently how you like 
} 

而且,即使對於throws也適用同樣的規則,即,如果你想,你可以在方法簽名上指定throwsArithmeticException(或任何RuntimeException),但它對調用者沒有任何區別,相反它會混亂代碼,這不是最佳實踐,你可以看看here就可以了。而當你在方法中指定了throws caluse時,檢查異常,則調用者被迫處理它,即調用者方法必須使用catch塊或throw再次明確處理它。

爲什麼在這種情況下它不能編譯?我想這是因爲它威脅 java.lang.Exception作爲檢查的異常。但如果是這樣的話,爲什麼 method1會編譯?

有,有兩個規則來處理檢查異常:

(1)catch它使用catch

(2)或從方法throw它(使用throws方法內在方法簽名中)

即,如果您的代碼塊throws選中了exeption,那麼無論您是需要在該方法內部捕獲它還是該方法需要顯式聲明第在它拋出Exception

0

的方法必須是這樣的編譯:

private void method2(int age) throws Exception 
{ 
    if (age > 30) 
     throw new Exception(); 
} 

然而,檢查型異常是能夠作用於該異常,做一些有意義的事情,如釋放資源等辦法,你就會知道只有在拋出Exception的實際子類時,該如何處理該異常。

0

在方法2.你錯過new關鍵字在行

throw Exception(); 

Java中的所有檢查的異常必須throws聲明中聲明,並且選中可以不申報。

檢查異常是從java.lang.Excetion類繼承的異常。但未檢查的異常繼承java.lang.RuntimeException類。

0

拋出子句中用於聲明異常和thow關鍵字用於顯式拋出異常。 所以,當你寫

private void method2(int age) { 
    if (age > 30) 
     throw Exception(); 
} 

你被明確,但沒有引發異常聲明,該方法可以使用throws條款拋出此異常。

所以正確的代碼將

private void method2(int age) throws Exception { 
if (age > 30) 
    throw new Exception(); 
    } 
+0

除了不正確的扔或抓住' Exception'。這是允許的,但不正確。 –

1

在這裏,在我看來,該java.lang.Exception的是威脅到了java.lang.RuntimeException或java.lang.Error的。即使你沒有處理它,你也可以聲明拋出它。

如果不是Exception,我們使用一個檢查的異常(即java.lang的子類。例外),那麼你應該必須在方法體內有一個throw聲明(或者調用一個引發檢查異常的方法)。對?

不可以。你可以聲明你拋出任何異常(選中或不選中)而不拋出任何異常。

例如,當在子類中重寫方法並且希望子類能夠拋出檢查的異常時,這是有意義的。覆蓋方法只能拋出父類聲明的檢查異常。

2

在第一1)的方法,

public double method1() throws Exception 
{ 
    return 0.7; 
} 

您正在傳播異常 [即檢查異常]到調用方法,這就是爲什麼你沒有看到編譯時異常。 讓我告訴你一些東西,可以讓你更好地理解,

public void call() { 
    method1(); // Because method1() is propagating compile time exception you must need to handle it here. 
    } 

    public double method1() throws Exception { 
    return 0.7; 
    } 

在上面的代碼中,()調用你會得到編譯時異常。

在第二種方法2)

private void method2(int age) { 
    if (age > 30) 
     throw new Exception(); //I am assuming you forgot to mention new in your code. 
} 

你扔檢查的異常,所以你必須要處理它。 相反,如果您將Exception()更改爲RuntimeException,以免在編譯時看到錯誤。如下圖所示,

private void method2(int age) { 
     if (age > 30) 
      throw new RuntimeException(); // you will not get compile time error. 
    } 

瞭解更多詳情, http://technostepup.com/CoreJava/ExceptionHandling/exception-types.php

0

在你的第一個例子,如果你調用一個方法,你必須處理它引發異常,因爲它是一個檢查一個。如果該方法拋出未經檢查的異常,則不需要處理它。

你的第二個例子不會編譯,因爲你試圖拋出Exception。你必須拋棄它的一個實例。如果在該代碼中,您只是將Exception更改爲RuntimeExceptionError或它們的子類,它仍然不會編譯,出於同樣的原因。

相關問題