Class.forName + ExceptionInInitializerError + 静态初始化 + 奇怪的数组初始化
Class.forName + ExceptionInInitializerError + static initialization + weird Array init
我最近“继承”了一个项目,并试图在本地获取一个服务实例 运行ning。我遇到并修复了一些类似于...
的代码问题
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
。这个错误与初始化Class B有关(静态初始化,没有实例化!!)。
仅供参考 > 可以通过两种方式解决此问题...
- Class A,使用
Class.forName("fully.qualified.package.B", false, this.getClass().getRuntime());
——其中第二个参数false
不初始化class.
- Class B,使用普通数组初始化
static String[] bar = { "Something" };
.
我感兴趣的是...
为什么通过 (String[]) Arrays.asList(...).toArray()
过度设计的初始化会导致这样的错误?
Solution/Edit: 与静态初始化无关,数组初始化完全错误,见下文...
(String[])Arrays.asList("Something").toArray();
将在运行时失败:它不返回 String[]
,而是返回 Object[]
。 Object[]
和 String[]
是可具体化的类型,因此它是经过检查的转换,并且因为 Object[]
不是 String[]
,所以它失败了。
使用Arrays.asList("Something").toArray(new String[0])
;或者只是 new String[]{"Something"}
.
我最近“继承”了一个项目,并试图在本地获取一个服务实例 运行ning。我遇到并修复了一些类似于...
的代码问题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
。这个错误与初始化Class B有关(静态初始化,没有实例化!!)。
仅供参考 > 可以通过两种方式解决此问题...
- Class A,使用
Class.forName("fully.qualified.package.B", false, this.getClass().getRuntime());
——其中第二个参数false
不初始化class. - Class B,使用普通数组初始化
static String[] bar = { "Something" };
.
我感兴趣的是...
为什么通过 (String[]) Arrays.asList(...).toArray()
过度设计的初始化会导致这样的错误?
Solution/Edit: 与静态初始化无关,数组初始化完全错误,见下文...
(String[])Arrays.asList("Something").toArray();
将在运行时失败:它不返回 String[]
,而是返回 Object[]
。 Object[]
和 String[]
是可具体化的类型,因此它是经过检查的转换,并且因为 Object[]
不是 String[]
,所以它失败了。
使用Arrays.asList("Something").toArray(new String[0])
;或者只是 new String[]{"Something"}
.