Java报错”InstantiationException”的原因以及解决办法

  • Post category:Java

Java中的InstantiationException是一种异常类型,表示试图使用new实例化一个抽象类或接口、或者使用Class.newInstance()方法来实例化一个指定类的对象,但该类无法被实例化。

可能引起InstantiationException的原因有以下几种:

  1. 尝试实例化一个抽象类或接口对象,这是不可能的,因为抽象类或接口是不能被直接实例化的。

  2. 使用了一个没有提供默认构造函数的类(即没有无参构造函数的类)。当使用Class.newInstance()方法实例化一个类对象时,该方法会默认调用该类的无参数构造函数来进行实例化,如果该类没有无参数构造函数,则会抛出InstantiationException异常。

  3. 类实例化过程中发生了异常。

解决InstantiationException的方法包括:

  1. 避免使用Class.newInstance()方法来实例化类对象,使用构造方法来代替。例如:GridPane gridPane = new GridPane()。

  2. 给类提供默认构造方法。

下面给出两个实例:

实例1:

public interface Shape {
    public void draw();
}

public class Triangle implements Shape {
    public void draw() {
        System.out.println("Draw a triangle.");
    }
}

public static void main(String[] args) {
    Shape shape = new Shape();   // 尝试实例化接口,会抛出InstantiationException异常
}

解决方法是:创建一个实现了该接口的类的对象,例如:

Shape shape = new Triangle();

实例2:

public class DemoClass {
    private int value;
    public DemoClass(int value){
        this.value = value;
    }
}

public static void main(String[] args) {
    Class<DemoClass> clazz = DemoClass.class;
    DemoClass demoClass = clazz.newInstance();  // DemoClass没有提供默认构造函数,会抛出InstantiationException异常
}

解决方法是:给DemoClass类提供一个默认构造函数,例如:

public DemoClass() {
}