静态初始化程序中的异常导致程序挂起

时间:2011-08-16 15:24:52

标签: java

我有一个GUI应用程序。在我的主类中,我有一个方法(称为createAndShow())来初始化我的所有GUI类。在每个GUI类中,我有static initializer来读取属性文件(资源包或配置文件)。如果文件或条目丢失或值错误,我会捕获异常,然后故意将MissingResourceException抛到上一级。在主类的createAndShow()方法中,我使用try-catch来捕获Exception。但不知何故,JVM拒绝到达那里。每当文件丢失时,抛出MissingResourceException,然后应用程序就会挂起。我期望createAndShow()方法将捕获该异常并优雅地退出。静态初始化程序中的异常抛出有什么特殊的东西吗?

我正在使用XP和java 1.6。

3 个答案:

答案 0 :(得分:6)

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

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

我的建议是做一个Configuration单例类,你可以使用What is an efficient way to implement a singleton pattern in Java?。在该类中创建一个init()load()方法,该方法可以抛出可以在createAndShow()方法中捕获的异常。

答案 1 :(得分:2)

加载类时将调用静态初始化程序块。如果它抛出异常,则不会加载该类,最终会出现NoClassDefFoundException。

您应该只记录错误,并在缺少资源时继续。或者,您不在静态初始化程序块中进行加载,而是在单独的类中进行加载,其唯一目的是加载这些资源包。

答案 2 :(得分:0)

静态初始化程序块中抛出的异常导致类未加载,这意味着使用该类的调用类也无法加载,除非您使用了一些非常谨慎的防御性编码技术。