我从来没有理解这一点,但为什么Java允许你从构造函数中抛出一个已检查的异常?
public class PerformanceLogger{
public PerformanceLogger() throws Exception{
//do stuff
}
}
拥有这样的代码的后果是你无法在类字段级别实例化实例。
class MyClass {
PerformanceLogger p = new PerformanceLogger(); //compile error
}
唯一有效的方法是从方法中调用构造函数。那为什么要这么麻烦?如果Java在编译时不允许从构造函数 中抛出已检查的异常 ,那会不会更清晰?
答案 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块中抛出已检查异常以及方法以外的方式创建此类对象。