所以,我有一個叫做Puzzle
的類,以及兩個(相關的)構造函數。一個構造函數不接受參數,另一個接受int,但也會引發異常。其基本思路是這樣的:如何在構造函數中避免這種不必要的throws語句?
public class Puzzle {
// Fields, methods, etc.
public Puzzle() {
this(3);
}
public Puzzle(int n) throws Exception {
if (n < 2) throw new Exception();
// More constructor code
}
}
當然,這並不能編譯,因爲接受一個int的構造函數拋出異常,並且不ARGS構造不處理或拋出異常。但是,由於很明顯看到異常永遠不會被拋出(在構造函數的主體中沒有更多的異常),所以這應該沒有關係。我可以只使用一個空白try-catch語句是這樣的:
public Puzzle() {
try {
this(3);
} catch (Exception e) {
// Never happens
}
}
這裏的問題是,調用this(3)
不再是構造函數的第一個語句,所以它不會編譯。似乎我必須用throws
子句標記此構造函數,即使我知道它永遠不會拋出異常。這真的很煩人,因爲調用代碼將需要有不必要的try-catch塊,否則他們將不得不拋出異常。有沒有一種優雅的方式可以解決這個問題?我知道我可以輕鬆地複製和粘貼一些代碼,但這與OOP中的所有聖潔內容背道而馳。有任何想法嗎?
這是最簡單的解決方案,它需要最少的修改。謝謝! – brenns10
因爲它永遠不會發生,所以使用AssertionError。存在非法參數時使用IllegalArgumentException。 –
@PeterLawrey--不理解你的論點。我將AssertionError與違反應該永遠不會發生的內部不變量(也就是說,您的代碼中存在邏輯錯誤)相關聯。 – jtahlborn