2011-02-08 55 views
0

我可以捕獲java.lang.Exception而不是它的子類嗎?我可以捕獲java.lang.Exception而不是其具體的子類嗎?

考慮這個塞納里奧:

public class Tree { 
    public static Tree newInstance() throws NoWaterException, NoSoilException, NoSunshineException { 
     ... 
     return new Tree(); 
    } 
} 

當我想樹一個例子,我可以這樣做:

public Tree plantTree() throws TreePlantExcetpion { 
    try { 
     ... 
     return Tree.newInstance(); 
    } catch (NoWaterException e) { 
     throw new TreePlantExcetpion("Cannot plant a tree since no water", e); 
    } catch (NoSoilException e) { 
     throw new TreePlantExcetpion("Cannot plant a tree since no soil", e); 
    } catch (NoSunshineException e) { 
     throw new TreePlantExcetpion("Cannot plant a tree since no sunshine", e); 
    } 
} 

但我也能做到這一點也可以使用:

public Tree plantTree() throws TreePlantExcetpion { 
    try { 
     ... 
     return Tree.newInstance(); 
    } catch (Exception e) { 
     throw new TreePlantExcetpion("Cannot plant a tree", e); 
    } 
} 

我更喜歡方法plantTree()的第二次執行,因爲它更短且清晰r,在這種方法中,我不關心Exception的具體子類,我需要做的是將它包裝在新的TreePlantExcetpion中並傳遞給它。所有的詳細信息都不會丟失。我確信Tree.newInstance()方法不會拋出任何其他類型的異常(至少現在)。我可以這樣做嗎?

注意NoWaterExceptionNoSoilExceptionNoSunshineException不能成爲TreePlantExcetpion子類。它們不在同一個繼承層次結構中。

問題是,如果異常處理對於所有捕獲到的異常都是相同的,那麼我可以只抓住他們的超類,即java.lang.Exception而不是?

回答

2

讓TreePlantException的NoWaterExceptionNoSoilExceptionNoSunshineException子類,你可以直接跳過整個try/catch語句,因爲TreePlantException如拋出已聲明。

+0

如果這些類不在繼承層次結構中,該怎麼辦? – chance 2011-02-08 12:41:52

相關問題