-3

我从来不明白这一点,但为什么 Java 允许你从构造函数中抛出一个检查异常?

public class PerformanceLogger{

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

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

class MyClass {

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

唯一有效的是从方法中调用构造函数。那么为什么要打扰呢?如果 Java 不允许在编译时从构造函数中抛出已检查的异常,这不是更干净吗?

4

6 回答 6

2

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

没有理由禁止它。

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

于 2013-03-19T16:32:19.343 回答
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 */ } 
    }
}
于 2013-03-19T16:33:18.680 回答
1

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

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

严格等同于:

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

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

尝试将字段初始化保留在构造函数中以避免此类问题。

于 2013-03-19T16:35:09.340 回答
0

您可以使用初始化块来实例化它们:

class MyClass {
  PerformanceLogger p;
  {
    try {
      p = new PerformanceLogger();
    } catch (Exception e) {
      // Handle the exception here (omitted for brevity).
    }
  }
}
于 2013-03-19T16:37:51.770 回答
0

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

于 2013-03-19T16:38:16.683 回答
0

你永远不知道,它什么时候有用。考虑在创建对象时需要执行一些 IO 操作的场景。构造函数是这样做的最佳场所。当你执行任何 IO 操作或任何不可靠的操作时,必然会出现异常。所以构造函数只有一种方式来传达对象创建失败,即通过抛出异常,因为它们不能返回任何值。

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

于 2013-03-19T16:39:20.060 回答