在Java中,InstantiationException
是一個(gè)運(yùn)行時(shí)異常,它發(fā)生在試圖通過 new
關(guān)鍵字實(shí)例化一個(gè)類時(shí),但該類或其任何父類都包含一個(gè)無參構(gòu)造函數(shù)且該構(gòu)造函數(shù)是私有的(private)。
下面是一個(gè)簡(jiǎn)單的例子來說明 InstantiationException
的情況:
class MyClass {
// 私有無參構(gòu)造函數(shù)
private MyClass() {
System.out.println("MyClass 的私有構(gòu)造函數(shù)被調(diào)用");
}
}
public class Main {
public static void main(String[] args) {
try {
// 嘗試實(shí)例化 MyClass,這將拋出 InstantiationException
MyClass obj = new MyClass();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
}
在這個(gè)例子中,MyClass
類有一個(gè)私有的無參構(gòu)造函數(shù)。當(dāng)我們嘗試使用 new MyClass()
實(shí)例化 MyClass
時(shí),Java 無法調(diào)用該私有構(gòu)造函數(shù),因此拋出了 InstantiationException
。
注意:如果你嘗試實(shí)例化的類或其父類包含一個(gè)公共(public)的無參構(gòu)造函數(shù),那么就不會(huì)拋出 InstantiationException
。例如:
class MyClass {
// 公共無參構(gòu)造函數(shù)
public MyClass() {
System.out.println("MyClass 的公共構(gòu)造函數(shù)被調(diào)用");
}
}
public class Main {
public static void main(String[] args) {
MyClass obj = new MyClass(); // 這里不會(huì)拋出 InstantiationException
}
}
在這個(gè)修改后的例子中,MyClass
有一個(gè)公共的無參構(gòu)造函數(shù),所以我們可以成功地實(shí)例化它,而不會(huì)遇到 InstantiationException
。