繁体   English   中英

在Java中,当对象无法实例化时会发生什么?

[英]In Java what happens when an object fails to be instantiated?

我来自c ++背景,我发现自己经常在java中这样做:

SomeClass sc=new SomeClass();

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

我想知道的是,如果构造函数由于某种原因(例如可能没有足够的内存)而失败,那么变量sc中会出现什么。 我找不到一个直接的答案,我担心我只是在浪费时间,因为如果新的操作员失败,程序会崩溃吗?

Java规范语言第3版彻底涵盖了您的问题:

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块中,但这非常不典型。 除非您计划在发生这种情况时执行某些有意义的操作,否则在大多数典型情况下,最好不要catch程序执行期间可能发生的任何Error

从文档:

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

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

相关问题

也可以看看

如果构造函数失败,那么它会抛出异常或错误,你不会在程序中得到任何进一步的结果。 具体来说,如果内存不足,则会出现OutOfMemoryError

是的,你在浪费你的时间:-)。 调用构造函数后,sc保证为非null。 如果构造函数失败,则抛出异常并且永远不会运行以下代码。 因此以下在Java中是安全的:

SomeClass sc = new SomeClass();
sc.doSomething();

不抛出NullPointerException。

if不需要检查,一些IDE甚至会抱怨它是不必要的,因为它总是评估为true new失败的唯一原因是构造函数抛出异常,在这种情况下,无论如何都会绕过if检查。

SomeClass sc=new SomeClass();

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

创建对象后,对象引用永远不会为null ,因此无需进行空检查,因为条件始终为true。

例如,如果构造函数中的内存不足,则会OutOfMemoryError ,构造函数将无法正常返回。

抛出OutOfMemoryError ,通常会使虚拟机崩溃。 (可能被视为Throwable)

您可能会发现Java OutOfMemory Error中的Prevent和Recover很有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM