从构造函数中调用构造函数并捕获异常

约翰·泰特

我有一个构造函数,它在同一类中调用另一个构造函数。问题是我想捕获异常并将它们向前扔给调用第一个构造函数的方法。但是Java不允许这样做,因为构造函数调用必须是构造函数中的第一条语句。

public Config(String fn) throws IOException, ExcFormattingError {
    theFile = fn;
    try { cfRead(); }
    catch(FileNotFoundException e) {
        //create a new config with defaults.
        theConfig = defaultConfig();
        create();
    } catch (IOException e) {
        throw new IOException(e);
    } catch (ExcFormattingError e) {
        throw new ExcFormattingError();
    }

    fixMissing(theConfig);
}

public Config() throws IOException, ExcFormattingError {
    try {
        //Line below is in error...
        this("accountmgr.cfg");
    } catch (IOException e) {
        throw new IOException(e);
    } catch (ExcFormattingError e) {
        throw new ExcFormattingError();
    }
}

如果有人可以解释我该怎么做,那将很好。一个额外的好处就是知道为什么这种语言必须如此行事,因为这总是很有趣。

罗希特·贾恩(Rohit Jain)

您不需要try-catch构造函数中的那些块(事实上,您已经知道了,您不能在其中编写块)。因此,将您的构造函数更改为:

public Config() throws IOException, ExcFormattingError {
    this("accountmgr.cfg");
}

实际上catch,您的构造函数中的代码块几乎无济于事。它只是重新创建相同异常的实例,然后将其抛出。考虑到如果引发了异常,它将自动传播到可以处理该异常的调用者代码这一事实,因此实际上并不需要这样做。

public void someMethod() {
    Config config = null;
    try {
        config = new Config();
    } catch (IOException e) { 
        // handle it
    } catch (ExcFormattingError e) {
        // handle it
    }
}

话虽这么说,从构造函数中抛出一个检查的异常几乎不是一个好主意,更糟糕的是在调用者代码中处理它们。
如果引发了异常,则可以在调用方法中对其进行处理。然后,您只是忽略了实例尚未完全初始化的事实。继续执行该实例将导致某些意外行为。因此,您应该避免使用它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在构造函数中捕获异常

来自分类Dev

C ++在构造函数中捕获异常

来自分类Dev

如何捕获构造函数异常?

来自分类Dev

构造函数中的异常

来自分类Dev

如何从构造函数中捕获异常而不处理整个函数?

来自分类Dev

异常构造函数中的异常

来自分类Dev

在构造函数中调用重载构造函数

来自分类Dev

构造函数中的调用函数

来自分类Dev

如何从C ++中的构造函数中捕获异常

来自分类Dev

如何在构造函数中捕获异步方法的异常?

来自分类Dev

构造函数中的异常处理

来自分类Dev

构造函数中的StackOverflowError异常

来自分类Dev

在构造函数中调用super()

来自分类Dev

构造函数中的事件调用

来自分类Dev

调用构造函数时异常的C ++行为

来自分类Dev

调用构造函数时出现nullpointer异常

来自分类Dev

调用Fragment构造函数导致异常,kotlin?

来自分类Dev

反射性地调用引发异常的构造函数

来自分类Dev

构造函数中的“无匹配函数调用”

来自分类Dev

在函数中调用缺少参数的构造函数

来自分类Dev

在构造函数中调用异步函数

来自分类Dev

扩展构造函数中的调用函数

来自分类Dev

是否有可能在派生类构造函数中捕获从基类构造函数抛出的异常

来自分类Dev

在复制构造函数定义中调用成员构造函数

来自分类Dev

如何在子类构造函数中调用父构造函数?

来自分类Dev

Android在构造函数NoClassDefFoundError中测试异常

来自分类Dev

Delphi在构造函数中引发异常

来自分类Dev

在对象构造函数中引发异常

来自分类Dev

在构造函数C ++中引发异常