【问题标题】:How can I avoid this unnecessary throws statement in a constructor?如何在构造函数中避免这种不必要的 throws 语句?
【发布时间】:2012-12-02 18:14:16
【问题描述】:

所以,我有一个名为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 中所有神圣的东西背道而驰。有什么想法吗?

【问题讨论】:

    标签: java exception constructor try-catch


    【解决方案1】:

    使用运行时异常。具体来说,IllegalArgumentException 就是为此而设计的。

    【讨论】:

    • 这是最简单的解决方案,需要最少的修改。谢谢!
    • 因为这是不应该发生的事情,所以使用 AssertionError。存在非法参数时使用 IllegalArgumentException。
    • @PeterLawrey - 在这里不理解您的论点。我将 AssertionError 与违反不应该发生的内部不变量相关联(也就是你的代码中有一个逻辑错误)。
    • @jtahlborn 这就是我认为// Never happens 的意思。即只有在发生一些严重的内部错误时才会发生这种情况。这是assert false; 抛出的错误。
    • @PeterLawrey - 哦,你在谈论如何重新抛出异常。我的回答是解决最初的异常抛出问题(至少,这是我的意图)。
    【解决方案2】:

    将构造函数中的代码拆分为私有初始化方法:

    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
        }
    }
    

    【讨论】:

    • 一个可行的想法,尽管私有初始化器很痛苦,因为您不能使用最终成员。
    • @jtahlborn 是的。您的回答是执行此操作的更好方法。
    • +1 是一个可行的解决方案。我不敢相信我没有想出那样的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多