为什么Boolean.class.newInstance()会抛出异常?

4

我认为这个主题已经很清楚了。我使用的是JDK 1.6.0更新26,并创建了一个新项目,只有一行来确认这一点:

Boolean.class.newInstance();

它会抛出以下错误:

Exception in thread "main" java.lang.InstantiationException: java.lang.Boolean
    at java.lang.Class.newInstance0(Class.java:340)
    at java.lang.Class.newInstance(Class.java:308)

这个操作是否本来就应该失败?如果是,为什么会失败呢?


当然,尝试创建另一个布尔值是没有意义的,因为每个可能的布尔值都已经被定义,即TRUE和FALSE。通过自动装箱,您只需使用truefalse - Peter Lawrey
3个回答

25

Boolean 类有两个构造函数,都只接受一个参数。调用 Boolean.class.newInstance() 是试图调用一个不存在的无参构造函数。


1
我不怎么写Java,主要是C++,我从来没有意识到这一点 - 你是说在Java中调用一个不存在的函数是一个_运行时_错误,而不是_编译时_错误吗?太有趣了。 - Kerrek SB
7
如果您编写调用构造函数的代码,则会产生编译时错误。该问题涉及Java反射API,允许您以动态方式调用方法、构造函数等。由于调用目标在编译时不知道,因此唯一可能的错误是运行时错误。 - Rob Harrop
但是在实际的代码中,我并不知道它是布尔值,我使用泛型和通过变量传递的类。那么,我如何创建任何作为变量给出的类的实例呢? - Max Yankov
@golergka - 只有当你知道要实例化的类的可用构造函数集时,才能这样做。并非所有类都有零参数构造函数。你到底想要实现什么? - Rob Harrop
我想创建一个通用的数据结构,它可以创建它的子元素。然而,我已经决定从提供的默认实例中克隆它们,而不是实例化。 - Max Yankov

2

给定一个类,你可以找出它需要构造的必要条件:

Class cl = // initialize somehow
// get all constructors for class
Constructor[] constructors = cl.getConstructors(); 

 // for each constructor
for(Constructor c : constructors)
{
     // if there is a zero-parameter constructor
    if(c.getParameterTypes().length == 0)
    {
        // then we can safely create a constructor for it
        cl.newInstance(); 
    }
}

0

Boolean类有两个不同的构造函数。它们都需要一个参数。其中一个需要一个boolean本身,而另一个需要一个String。如果在将字符串传递给Boolean类时,该字符串不为空,则会被识别为将Boolean设置为true。如果它是null或不包含任何内容,则为false


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接