当Java中的一个对象无法被实例化时会发生什么?
当Java中的一个对象无法被实例化时会发生什么?
我来自于C++的背景,在Java中经常遇到以下情况:
SomeClass sc=new SomeClass(); if(null!=sc) { sc.doSomething(); }
我想知道如果构造函数失败了(比如可能是由于内存不足),变量sc里会有什么。我找不到一个清晰的答案,我担心这只是浪费时间,因为如果new运算符失败程序不是也会崩溃吗?
admin 更改状态以发布 2023年5月21日
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
。
从文档中可以看到:
Error
是Throwable
的子类,表示合理应用程序不应该try
捕捉的严重问题。大多数这样的错误都是异常情况。在其
throws
子句中不需要声明可能在方法执行期间被抛出但未被捕获的Error
的任何子类,因为这些错误是不应该发生的异常情况。
相关问题
- 捕获java.lang.OutOfMemoryError
- 何时捕获java.lang.Error?
- 是否可以在Java中捕获内存不足异常?
- JVM是否可以在无需重新启动的情况下恢复OutOfMemoryError
- 如何处理Java中的OutOfMemoryError?