[英]How can I avoid this unnecessary throws statement in a constructor?
所以,我有一個叫做Puzzle
的類,還有兩個(相關的)構造函數。 一個構造函數不接受args,另一個接受一個int,但也拋出異常。 基本想法是這樣的:
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中所有神聖的東西相悖。 有任何想法嗎?
使用運行時異常。 具體來說,IllegalArgumentException就是為此而設計的。
將構造函數中的代碼拆分為私有的初始化方法:
public class Puzzle {
// Fields, methods, etc.
public Puzzle() {
construct(3);
}
public Puzzle(int n) throws Exception {
if (n < 2) throw new Exception();
construct(n);
}
private void construct(int n) {
// More constructor code
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.