簡體   English   中英

如何在構造函數中避免這種不必要的throws語句?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM