在Java中,当对象无法实例化时会发生什么? 我来自C++背景,我发现自己经常在java中这样做: SomeClass sc=new SomeClass(); if(null!=sc) { sc.doSomething(); }

在Java中,当对象无法实例化时会发生什么? 我来自C++背景,我发现自己经常在java中这样做: SomeClass sc=new SomeClass(); if(null!=sc) { sc.doSomething(); },java,object,new-operator,instantiation,creation,Java,Object,New Operator,Instantiation,Creation,我想知道的是,如果构造函数由于某些原因(比如可能没有足够的内存)失败,变量sc中会出现什么。我不能 我找不到一个直截了当的答案,我担心我只是在浪费时间,因为如果新的操作符失败,程序会崩溃吗?如果构造函数失败,那么它会抛出异常或错误,你将无法在程序中取得进一步的进展。具体来说,如果内存不足,您将收到OutOfMemoryError。是的,您在浪费时间:-。在调用构造函数后,sc保证为非null。如果构造函数失败,将引发异常,并且以下代码将永远不会运行。因此,以下内容在Java中是安全的: Some

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

如果构造函数失败,那么它会抛出异常或错误,你将无法在程序中取得进一步的进展。具体来说,如果内存不足,您将收到OutOfMemoryError。

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

SomeClass sc = new SomeClass();
sc.doSomething();
不抛出NullPointerException。

如果不需要检查,一些IDE甚至会抱怨它没有必要,因为它的计算结果总是为true。new失败的唯一原因是构造函数抛出异常,在这种情况下,您的if检查将被忽略。

抛出异常,通常会使虚拟机崩溃。 可能被认为是可以扔掉的

你可能会觉得有用

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

例如,如果构造函数中的某一点内存不足,将抛出OutOfMemoryError,构造函数将无法正常返回。

Java规范语言第三版详细介绍了您的问题:

每当创建一个新的类实例时,都会为其分配内存空间,并为类类型中声明的所有实例变量和类类型的每个超类中声明的所有实例变量(包括可能隐藏的所有实例变量)留出空间。如果没有足够的可用空间来为对象分配内存,则类实例的创建会突然完成,并且会出现一个错误。否则,新对象中的所有实例变量(包括在超类中声明的实例变量)都将初始化为其默认值

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

因此,新表达式不可能返回null。如果执行正常完成,则返回的内容将始终是实例化的任何类的有效实例

异常处理 一般来说,可能的异常通常通过try-catch块处理:

在你的情况下,你可以考虑在一个尝试块中添加一个新的数据集,这个内存块有一个对应的内存,但是这是非常不典型的。除非您计划在发生这种情况时做一些有意义的事情,否则在大多数典型的场景中,最好不要捕捉程序执行期间可能发生的任何事件

从文件中:

错误是Throwable的一个子类,它表示一个合理的应用程序不应该试图捕获的严重问题。大多数此类错误都是异常情况

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

相关问题 另见
如果内存可用,则为OutOfMemoryError-在爪哇中,你不必使用这种倒置形式的条件检查,只有布尔表达式在IFFATE中被接受。C++来自于C++背景吗?你也不必在C++中做这个检查。@ Bakkal,即使它只防止了java中的布尔类型的陷阱,许多编码标准使用这种样式,因为它导致代码在扫描代码时更容易解析。如果0==longMethodCallWithManyArguments{与如果longMethodCallWithManyArguments==0{首先,你不需要读/解析整行代码就可以看到它的意思。为了挑出错误,NullPointerException可能是由于doSomething本身的执行而产生的,例如,如果它是doSomethingStupid。只是要明确一点,你说的是一个类总是会被初始化的,如果不是的话,程序会崩溃?所以可以安全地假设在这个过程中一个程序的运行——所有初始化然后实例化的类——不抛出错误/异常——将始终调用它们的构造函数并可用?
SomeClass sc=new SomeClass();

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