我有一个GUI应用程序。在我的主类中,我有一个方法(称为createAndShow()
)来初始化我的所有GUI类。在每个GUI类中,我有static initializer
来读取属性文件(资源包或配置文件)。如果文件或条目丢失或值错误,我会捕获异常,然后故意将MissingResourceException
抛到上一级。在主类的createAndShow()
方法中,我使用try-catch来捕获Exception
。但不知何故,JVM拒绝到达那里。每当文件丢失时,抛出MissingResourceException
,然后应用程序就会挂起。我期望createAndShow()
方法将捕获该异常并优雅地退出。静态初始化程序中的异常抛出有什么特殊的东西吗?
我正在使用XP和java 1.6。
答案 0 :(得分:6)
静态初始值设定项由类加载器调用,而不是由任何用户代码调用。
您将无法捕获这些异常,并且由于无法加载您需要的类,因此您的应用程序将崩溃。
我的建议是做一个Configuration单例类,你可以使用What is an efficient way to implement a singleton pattern in Java?。在该类中创建一个init()
或load()
方法,该方法可以抛出可以在createAndShow()
方法中捕获的异常。
答案 1 :(得分:2)
加载类时将调用静态初始化程序块。如果它抛出异常,则不会加载该类,最终会出现NoClassDefFoundException。
您应该只记录错误,并在缺少资源时继续。或者,您不在静态初始化程序块中进行加载,而是在单独的类中进行加载,其唯一目的是加载这些资源包。
答案 2 :(得分:0)
静态初始化程序块中抛出的异常导致类未加载,这意味着使用该类的调用类也无法加载,除非您使用了一些非常谨慎的防御性编码技术。