Java 静态初始值设定项中的异常导致程序挂起

Java 静态初始值设定项中的异常导致程序挂起,java,Java,我有一个GUI应用程序。在我的主类中,我有一个名为createAndShow的方法来初始化所有GUI类。在每个GUI类中,我都有静态初始值设定项来读取属性文件、资源包或配置文件。如果文件或条目丢失或值错误,我会捕获异常,然后故意向上层抛出MissingResourceException。在主类的createAndShow方法中,我放置了一个try-catch-to-catch异常。但不知何故,他拒绝去那里。每当文件丢失时,就会抛出MissingResourceException,然后应用程序就会

我有一个GUI应用程序。在我的主类中,我有一个名为createAndShow的方法来初始化所有GUI类。在每个GUI类中,我都有静态初始值设定项来读取属性文件、资源包或配置文件。如果文件或条目丢失或值错误,我会捕获异常,然后故意向上层抛出MissingResourceException。在主类的createAndShow方法中,我放置了一个try-catch-to-catch异常。但不知何故,他拒绝去那里。每当文件丢失时,就会抛出MissingResourceException,然后应用程序就会挂起。我希望createAndShow方法能够捕获该异常并优雅地退出。对于静态初始值设定项引发的异常有什么特殊的吗


我使用的是XP和java 1.6。

静态初始值设定项由类加载器调用,而不是由任何用户代码调用

您将无法捕获这些异常,并且由于无法加载所需的类,您的应用程序将崩溃


我的建议是做一个配置单例类,您可以使用。在该类中创建一个init或load方法,该方法将能够抛出可以在createAndShow方法中捕获的异常。

静态初始值设定项由类加载器调用,而不是由任何用户代码调用

您将无法捕获这些异常,并且由于无法加载所需的类,您的应用程序将崩溃


我的建议是做一个配置单例类,您可以使用。在该类中创建一个init或load方法,该方法将能够抛出可以在createAndShow方法中捕获的异常。

加载该类时将调用静态初始值设定项块。如果它抛出异常,则不会加载该类,最终将导致NoClassDefFoundException


您应该简单地记录错误,并在缺少资源时继续。或者,您不在静态初始值设定项块中进行加载,而是在单独的类中进行加载,该类的唯一目的是加载这些资源束。

加载类时将调用静态初始值设定项块。如果它抛出异常,则不会加载该类,最终将导致NoClassDefFoundException


您应该简单地记录错误,并在缺少资源时继续。或者,您不在静态初始值设定项块中加载,而是在单独的类中加载,该类的唯一目的是加载这些资源束。

静态初始值设定项块中引发的异常会导致类未加载,这意味着使用该类的调用类也无法加载,除非您正在使用一些非常谨慎的防御性编码技术。

静态初始值设定项块中引发的异常会导致未加载该类,这意味着使用该类的调用类也无法加载,除非您正在使用一些非常谨慎的防御性编码技术。

…这意味着您无法捕获异常,这也是您应该避免使用静态初始值设定项的主要原因。@Nicola在我将其编辑到答案时,您可能在评论。但从异常堆栈中,我们可以看到指示它的序列在引发到达点异常之前,已检查了我的createAndShow。@5YrsLaterDBA,这是因为createAndShow方法是第一个尝试加载类的方法。您的方法正在间接执行静态初始值设定项,因为JVM碰巧第一次加载了您的类……这意味着您无法捕获异常,这也是您应该避免使用静态初始值设定项的主要原因。@Nicola您可能在我将其编辑到答案中时发表了评论。但是从异常堆栈我们可以看到一个序列,表明它在到达引发异常的点之前通过了我的createAndShow。@5YrsLaterDBA,这是因为createAndShow方法是第一个尝试加载类的方法。您的方法是间接执行静态初始值设定项,因为JVM恰好是第一次加载您的类。