允许您在构造函数中抛出Checked Exceptions的目的是什么?

时间:2013-03-19 16:29:58

标签: java

我从来没有理解这一点,但为什么Java允许你从构造函数中抛出一个已检查的异常?

public class PerformanceLogger{

    public PerformanceLogger() throws Exception{
        //do stuff
    }
}

拥有这样的代码的后果是你无法在类字段级别实例化实例。

class MyClass {

    PerformanceLogger p = new PerformanceLogger(); //compile error  
}

唯一有效的方法是从方法中调用构造函数。那为什么要这么麻烦?如果Java在编译时不允许从构造函数 中抛出已检查的异常 ,那会不会更清晰?

6 个答案:

答案 0 :(得分:2)

这与返回对象的任何方法完全相同,不多也不少。

没有理由禁止它。

如果它被禁止,构造函数将如何调用抛出异常的其他方法?通过捕捉它们全部?

答案 1 :(得分:1)

您不应该实例化实例变量inline

你应该declare他们,然后assign他们在构造函数中。

class MyClass 
{
    final PerformanceLogger p;

    public MyClass()
    {
        try { p = new PerformanceLogger(); }
        catch ( final Exception e ) { /* do something with it here */ } 
    }
}

您将以相同的方式实例化static变量

class MyClass 
{
    static final PerformanceLogger P;

    static
    {
        try { P = new PerformanceLogger(); }
        catch ( final Exception e ) { /* do something with it here */ } 
    }
}

答案 2 :(得分:1)

类字段初始化由编译器自动移入构造函数,即:

public class MyClass {
    private PerformanceLogger p = new PerformanceLogger();
}

与以下内容完全相同:

public class MyClass {
    private PerformanceLogger p;
    public MyClass() {
        p = new PerformanceLogger();
    }
}

这样,您可以通过try-catch块包围初始化。

尝试在构造函数中保留字段初始化,以避免出现这类问题。

答案 3 :(得分:0)

您可以使用初始化块对其进行实例化:

class MyClass {
  PerformanceLogger p;
  {
    try {
      p = new PerformanceLogger();
    } catch (Exception e) {
      // Handle the exception here (omitted for brevity).
    }
  }
}

答案 4 :(得分:0)

我们可以在构造函数中编写代码,可能会发生异常。我们必须将这些异常抛给我们调用类对象的方法。

答案 5 :(得分:0)

你永远不知道,什么时候会有用。考虑在创建对象时需要执行某些IO操作的场景。构造者是最好的地方。执行任何IO操作或任何不可靠的操作时,必然会发生异常。因此构造函数只有一种传达对象创建失败的方式,即抛出异常,因为它们不能返回任何值。

还有一件事,您可以使用构造函数在静态或init块中抛出已检查异常以及方法以外的方式创建此类对象。