当前位置: 首页 > 面试题库 >

如何处理引发检查异常的静态最终字段初始化程序

冯元魁
2023-03-14
问题内容

我正面临一个用例,其中我想static final用一个初始化器语句声明一个字段,该语句被声明为引发一个检查异常。通常,它看起来像这样:

公共静态最终ObjectName OBJECT_NAME = new ObjectName(“ foo:type = bar”);

我在这里遇到的问题是,ObjectName构造函数可能会抛出各种我不关心的检查异常(因为我知道我的名字是有效的,并且如果它不幸崩溃则可以)。Java编译器不会让我忽略这个(因为它是一个检查的异常),所以我不愿诉诸:

公共静态最终ObjectName OBJECT_NAME;
静态的{
    尝试{
        OBJECT_NAME =新的ObjectName(“ foo:type = bar”);
    }抓住(最终例外){
        抛出新的RuntimeException(“无法在静态块中创建ObjectName实例。”,ex);
    }  
}

因为静态块确实非常难以阅读。有人对如何以一种干净的方式处理此案有建议吗?


问题答案:

如果您不喜欢静态块(有些人不喜欢),那么可以选择使用静态方法。IIRC的Josh Bloch建议这样做(在快速检查中显然不是在Effective
Java中)。

public static final ObjectName OBJECT_NAME = createObjectName("foo:type=bar");

private static ObjectName createObjectName(final String name) {
    try {
        return new ObjectName(name);
    } catch (final SomeException exc) {
        throw new Error(exc);
    }  
}

要么:

public static final ObjectName OBJECT_NAME = createObjectName();

private static ObjectName createObjectName() {
    try {
        return new ObjectName("foo:type=bar");
    } catch (final SomeException exc) {
        throw new Error(exc);
    }  
}

(编辑:更正了第二个示例,以从方法返回而不是分配static。)



 类似资料:
  • 问题内容: 我尝试了解通过引用同一封闭类对象初始化静态字段时初始化顺序的行为。 上面这段代码的输出是: 如果我将变量修改为除plain之外的其他任何内容: 输出为: 为什么会这样呢? 请注意,即使同时声明了两者,输出也是如此,在这种情况下,声明之前 问题答案: 静态最终成员先于其他静态成员初始化。 非最终静态成员按出现顺序初始化 因此,在您的第一种情况下: 构造函数在初始化之前首先被调用,因此被显

  • 静态字段何时初始化?如果我从未实例化过一个类,但我访问了一个静态字段,那么用于实例化私有静态字段的所有静态块和私有静态方法(按顺序)都在那一刻被调用了吗?或者什么时候启动应用程序?

  • 问题内容: Java为什么不允许从静态初始化块中引发检查异常?这个设计决定背后的原因是什么? 问题答案: 因为无法在源中处理这些检查的异常。您对初始化过程没有任何控制,并且无法从源代码中调用static {}块,因此可以用try-catch包围它们。 由于您无法处理检查异常指示的任何错误,因此决定禁止抛出检查异常静态块。 静态块不得抛出已检查的异常,但仍允许引发未检查的/运行时异常。但是根据上述原

  • 很简单的问题是,如何初始化可能引发构造函数异常的类成员变量? 显然,您不能在构造函数初始化器中尝试捕获异常,因此在构造函数中的try catch块中构造对象是否更合适? 这是一个顶级类,因此处理异常以让用户知道发生了什么并优雅地退出比让程序因异常而崩溃更重要? 但是,这不起作用,因为对象在构造函数内初始化之前初始化一次,因此如果对象引发异常,程序可能会崩溃。

  • 问题内容: 如标题所示,两者之间到底有什么区别 和 除了结构以外,还有什么重要区别吗? 问题答案: 对于您的示例,没有区别。但是如您所见, 只能接受一个表达式来初始化变量。但是,在静态初始化器(JLS 8.7)中,可以执行任意数量的语句。例如,可以这样做: 对于您的示例,显然不需要这样做,但是变量的初始化可能不仅仅使用表达式,甚至可能包含许多语句,因此Java制作了静态初始化器。

  • 当一个类本身有一个静态实例时,我很难理解初始化顺序。另外,为什么