2017-06-13 165 views
1

在測試情況下,我也行未處理的異常 - 拋出不工作

ZahlPasstNicht zahlPasstNicht = new ZahlPasstNicht(min, max, ist); 

第二部分是強調了紅色和它說:未處理的異常:ZahlPasstNicht

我可以使用嘗試/ catch或讓構造函數拋出一個錯誤,我試圖做後者:

public class ZahlPasstNicht extends IndexOutOfBoundsException { 
    int a; 
    int b; 
    int c; 

    public ZahlPasstNicht(int a, int b, int c) throws ZahlPasstNicht { 
     this.a = a; 
     this.b = b; 
     this.c = c; 
    } 

我在做什麼錯?

+1

這是一個奇怪的用例。拋出異常的可能性爲零,異常類不應拋出異常。 –

+0

如果你在構造'ZahlPasstNicht'時設法導致'ZahlPasstNicht'類型的異常,我預見到一個無限循環......我曾經看到一個系統在記錄導致它記錄錯誤的錯誤時拋出一個錯誤。 。日誌文件爆炸到50Gb。 – Persixty

+0

另外,拋出'throws RuntimeException'是一種糟糕的做法,其中'IndexOutOfBoundsException'是'RuntimeException'。未經檢查的異常不需要「拋出」。只有把'throws'用於檢查異常。 –

回答

0

沒有什麼錯在提供的代碼。從技術上講,這是正確的,但不是邏輯上的。你可以看到它工作正常。 You can see working code here

注:ideone,我被允許的代碼只有一個文件,所以ZahlPasstNicht類是不公開的在這裏。

代碼爲邏輯上不正確因爲:

  • 茲聲明構造ZahlPasstNicht拋出ZahlPasstNicht但沒有代碼拋出ZahlPasstNicht類型的例外的ZahlPasstNicht構造。
  • 此外,如果在構造函數ZahlPasstNicht中拋出類型爲ZahlPasstNicht的異常,則它將陷入無限循環。

該問題似乎在代碼的任何其他部分。確保構造函數ZahlPasstNicht的參數是兼容的,即變量min,maxist的類型爲int

1
public ZahlPasstNicht(int a, int b, int c) throws ZahlPasstNicht 

你的構造函數指定,它可以throw,但你把它稱爲try塊之外因此例外是未處理的。

我不認爲你需要在這種情況下的throw部分。

3

我想不出任何情況下,將throws子句放入異常類的構造函數中是有意義的,因爲異常類在實例化時不應該拋出另一個異常(尤其不是自身) 。

只要寫

public ZahlPasstNicht(int a, int b, int c) { 
    this.a = a; 
    this.b = b; 
    this.c = c; 
} 

,通常,如果你不打算把它扔到你不會實例化一個異常類。

這並沒有太大的意義:

ZahlPasstNicht zahlPasstNicht = new ZahlPasstNicht(min, max, ist); 

這並不:

throw new ZahlPasstNicht(min, max, ist);