当Java中的一个对象无法被实例化时会发生什么?

44 浏览
0 Comments

当Java中的一个对象无法被实例化时会发生什么?

我来自于C++的背景,在Java中经常遇到以下情况:

SomeClass sc=new SomeClass();
if(null!=sc)
{
    sc.doSomething();
}

我想知道如果构造函数失败了(比如可能是由于内存不足),变量sc里会有什么。我找不到一个清晰的答案,我担心这只是浪费时间,因为如果new运算符失败程序不是也会崩溃吗?

admin 更改状态以发布 2023年5月21日
0
0 Comments

如果构造函数失败,它会抛出异常或错误,程序就无法继续执行下去。具体来说,如果内存用尽,会出现OutOfMemoryError

0
0 Comments

Java规范语言第三版全面涵盖了您的问题:

12.5 创建新类实例

每当创建一个新的类实例时,都会为其分配内存空间,以容纳类类型中声明的所有实例变量以及类类型中的每个超类声明的所有实例变量,包括可能被隐藏的所有实例变量。如果没有足够的可用空间来分配对象的内存,则创建类实例会以一个OutOfMemoryError异常突然终止。否则,新对象中的所有实例变量,包括超类中声明的那些变量,都将被初始化为它们的默认值。

在将对新创建的对象的引用作为结果返回之前,将处理所指定的构造函数,使用以下过程初始化新对象:[...]

因此,一个new表达式不可能返回null。无论返回什么,如果执行正常完成,将始终是任何已实例化类的有效instanceof


处理异常

一般来说,可能存在的异常通常使用try-catch块处理:

String someString = askFromUser();
try {
   int num = Integer.parseInt(someString);
   doSomethingWith(num);
} catch (NumberFormatException e) {
   complainAboutIt();
}

在您的情况下,您可以考虑将new SomeClass()放入带有相应catch (OutOfMemoryError e)try块中,但这是非常不寻常的。除非您计划在发生此情况时执行某些有意义的操作,在大多数典型情况下,最好不要捕获可能在程序执行期间发生的任何Error

从文档中可以看到:

ErrorThrowable的子类,表示合理应用程序不应该try捕捉的严重问题。大多数这样的错误都是异常情况。

在其throws子句中不需要声明可能在方法执行期间被抛出但未被捕获的Error的任何子类,因为这些错误是不应该发生的异常情况。

相关问题

另请参阅

0