Java中的InstantiationException是一种异常类型,表示试图使用new实例化一个抽象类或接口、或者使用Class.newInstance()方法来实例化一个指定类的对象,但该类无法被实例化。
可能引起InstantiationException的原因有以下几种:
-
尝试实例化一个抽象类或接口对象,这是不可能的,因为抽象类或接口是不能被直接实例化的。
-
使用了一个没有提供默认构造函数的类(即没有无参构造函数的类)。当使用Class.newInstance()方法实例化一个类对象时,该方法会默认调用该类的无参数构造函数来进行实例化,如果该类没有无参数构造函数,则会抛出InstantiationException异常。
-
类实例化过程中发生了异常。
解决InstantiationException的方法包括:
-
避免使用Class.newInstance()方法来实例化类对象,使用构造方法来代替。例如:GridPane gridPane = new GridPane()。
-
给类提供默认构造方法。
下面给出两个实例:
实例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() {
}