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

  • Post category:Java

InstantiationException 是 Java 报告的一个异常,代表着尝试创建一个抽象类、接口、数组类、基本类型或者不具有默认构造函数的类对象时发生错误。

Java 中,使用 new 关键字来实例化一个对象时,JVM 会通过找到类的构造函数并分配内存来创建新的实例化对象。但是,如果某个类不能够被实例化,则会抛出 InstantiationException 异常。

通常来讲,有如下几个原因会引发 InstantiationException 异常:

  1. 类本身是抽象类或接口
  2. 类使用了 private 的构造函数
  3. 类初始化失败

解决办法如下:

  1. 类本身是抽象类或接口:不能实例化抽象类或接口,需创建该抽象类或接口的子类来实现具体的对象。比如可以创建一个非抽象的类,并继承抽象类或实现接口,然后通过该子类实例化对象:
abstract class AbstractClass {
    public String method() {
        return "abstract";
    }
}

public class MyClass extends AbstractClass {
    public String method1() {
        return "concrete";
    }
}

MyClass myClass = new MyClass();
  1. 类使用了 private 的构造函数:private 的构造函数只能在类内部被访问,外部类无法使用,因此无法实例化该类。解决方法是在原类中添加公共的构造函数,或者使用反射机制强制访问私有构造函数:
public class PrivateConstructorClass {
    private PrivateConstructorClass() {
    }

    public static PrivateConstructorClass newInstance() throws Exception {
        Constructor<PrivateConstructorClass> constructor = PrivateConstructorClass.class.getDeclaredConstructor();
        constructor.setAccessible(true);
        return constructor.newInstance();
    }
}

PrivateConstructorClass privateC = PrivateConstructorClass.newInstance();
  1. 类初始化失败:类初始化失败可能是由缺少必要的配置、缺少必要工具等原因引起,在初始化类之前,需确保配置和工具的完整性和正确性。比如,以下代码就会抛出 InstantiationException 异常,因为 Config 类没有被正确初始化:
public class Config {
    private static String dbUrl = "";
    private static String dbUserName = "";
    private static String dbPassword = "";
    static {
        Properties props = new Properties();
        try {
            props.load(new FileInputStream("config.properties"));
            dbUrl = props.getProperty("db.url");
            dbUserName = props.getProperty("db.userName");
            dbPassword = props.getProperty("db.password");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

Config config = new Config(); // 抛出InstantiationException

综上所述,InstantiationException 异常通常由于实例化抽象类、实例化接口、使用私有构造函数或类初始化失败造成。解决方法是创建子类、添加公共的构造函数或检查必要的配置和工具是否正确。