gpt4 book ai didi

java - 如何捕获静态初始化程序 block 中抛出的异常

转载 作者:行者123 更新时间:2023-12-04 05:33:16 24 4
gpt4 key购买 nike

我写了以下代码:

    static {
/* Attempts to load JDBC driver */
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
throw new DBConfigurationException("JDBC Driver not found.", e);
}
/* Attempts to load configuration */
conf = loadConfiguration(); //this may throw some subclasses of RuntimeException
}

因为我想只加载一次 JDBC 驱动程序和配置。

我想在启动时做这样的事情(我会尽可能简化):
public static void main(String[] args) {
try {
// load the class that contains the code above
} catch (DBConfigurationException e) {
// display proper error message using JOptionPane, then quit
} catch (MissingConfigurationException e) {
// display proper error message using JOptionPane
// show a JDialog and allow user to input and store a configuration
} catch (InvalidConfigurationException e) {
// display proper error message using JOptionPane
// show a JDialog and allow user to input and store a configuration
}

/* if everything it's ok */
// do some other checks in order to decide which JFrame display first.
}

现在的问题是,如果发生异常,JVM 会抛出广告 ExceptionInInitializerError并且不会构造对象。
可能我还是明白出了什么问题, catch ExceptionInInitializerError (即使这对我来说听起来是错误的)并检查其原因(我仍然没有尝试这样做,但我认为这是可能的)。

我需要那个对象,因为如果异常是可恢复的(例如 MissingConfigurationException),程序将不会退出并且需要那个对象。

我应该避免使用静态初始化程序吗?
我可以做这样的事情:
private static final Configuration conf = null;

Constructor() {
if (conf == null) {
/* Attempts to load JDBC driver */
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
throw new DBConfigurationException("JDBC Driver not found.", e);
}
/* Attempts to load configuration */
conf = loadConfiguration();
}
}

但即使这对我来说听起来也不正确:只有在第一次尝试使用时才会抛出异常(我知道这将在启动时发生,因为我必须进行检查), 当类加载时。所以理论上第一种方法更正确。 :\

我该怎么办?哪种方式更正确?

问题是带有静态初始化器的类需要驱动程序和配置,所以在它们都可用之前不应该使用它。 :\

最佳答案

为什么不在 main() 中检查这些条件?方法,或由 main() 调用的东西方法?应用程序的入口点只能输入一次。一个简单的方法比静态初始化器和类加载器技巧要好得多。

public static void main(String[] args) {
if (!requirementsMet()) {
System.exit(1);
}
//proceed with app...
}

private static boolean requirementsMet() {
// check if DB driver can be loaded, and other non-recoverable errors
}

关于java - 如何捕获静态初始化程序 block 中抛出的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12305809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com