0

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

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抛出了 an 。此错误与初始化 B 类有关(静态初始化,没有实例化!!)。

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

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

我感兴趣的是...

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


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

4

1 回答 1

4

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

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

于 2021-05-17T13:53:04.970 回答