【问题标题】:Class.forName + ExceptionInInitializerError + static initialization + weird Array init [duplicate]Class.forName + ExceptionInInitializerError + 静态初始化 + 奇怪的数组初始化 [重复]
【发布时间】:2021-05-17 13:50:49
【问题描述】:

我最近“继承”了一个项目并试图让一个服务实例在本地运行。我遇到了 - 并修复了 - 一些类似于...的代码问题。

class A {
   // ...
   public void doSomething() {
      // ...
      Class foo = Class.forName("fully.qualified.package.B"); 
      // ...  
   }
   // ...
}

class B {
    static String[] bar = (String[])Arrays.asList("Something").toArray();
    //...
}

当 Class A.doSomething() 运行时,一个ExceptionInInitializerError 被抛出。此错误与初始化 B 类有关(静态初始化,没有实例化!!)。

仅供参考>解决此问题可以通过两种方式完成...

  • A 类,使用Class.forName("fully.qualified.package.B", false, this.getClass().getRuntime()); - 其中第二个参数false 不会初始化该类。
  • B 类,使用普通数组初始化 static String[] bar = { "Something" };

我感兴趣的是……

为什么通过(String[]) Arrays.asList(...).toArray() 进行的有些过度设计的初始化会导致这样的错误?


解决方案/编辑:它与静态初始化无关,数组初始化完全错误,见下文...

【问题讨论】:

    标签: java java.lang.class


    【解决方案1】:

    (String[])Arrays.asList("Something").toArray(); 将在运行时失败:它不是返回 String[],而是返回 Object[]Object[]String[] 是可具体化的类型,所以它是一个检查型强制转换,并且因为 Object[] 不是 String[],所以它会失败。

    使用Arrays.asList("Something").toArray(new String[0]);或者只是new String[]{"Something"}

    【讨论】:

    • 你说得对,我没想到要质疑演员阵容,只关注静态初始化。项目已经上线并正在运行,我认为这会奏效。正如我在问题中所写的那样,FYA - 通过{"..."} 初始化数组可以解决问题。谢谢你让我大开眼界:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 2021-01-31
    • 2017-08-26
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    相关资源
    最近更新 更多