假设我们有一些如下所示的代码(我知道这是不好的做法):
try {
new myObject();
} catch {
//stuff
}
返回的对象会发生什么?它仍然存储在堆上吗?这应该引发编译时错误吗?
假设我们有一些如下所示的代码(我知道这是不好的做法):
try {
new myObject();
} catch {
//stuff
}
返回的对象会发生什么?它仍然存储在堆上吗?这应该引发编译时错误吗?
它被创建,然后立即有资格进行垃圾收集。
我看不出它应该抛出异常的任何理由(当然,除非MyObject
构造函数抛出异常),这是完全合法的语法。
1) 是的,这段代码会产生编译时错误
try {
new myObject();
} catch { <-- syntax error
//stuff
}
2)如果您试图捕获编译时错误,即使使用正确的语法也无法正常工作
3) 如果我们修复 try/catch 问题,那么 MyObject 将被成功创建(除非它的构造函数抛出异常),但由于代码中没有任何引用它,它可能会像任何其他对象一样符合 GC 条件。“可能”,因为不一定如此,请考虑一下
class MyObject {
static MyObject myObect; <-- this field will be preventing the instance from GC
MyObject() {
myObject = this;
}
}
创建 MyObject 后,在静态字段中存储了对自身的引用,这将使其保持活动状态,但如果您调用 new MyObject() 它将覆盖以前的引用等
它将有资格进行垃圾收集。不需要立即进行垃圾收集。
它不会抛出异常,因为它可以是完全有效的代码。该对象的构造函数可能会产生副作用。它可以写一个文件。它可以增加一个静态变量。它可能会改变你传入的对象。
该对象不会立即被标记为准备好进行 GC。只有当没有活动线程可以访问该对象时(在此上下文中),它才会被标记为这样。不过我真的不明白这样做有什么意义,开发人员不能直接调用 java 的 GC;它只会在 java 认为需要它时运行。
无论如何,为什么有人会创建一个在创建后无法直接引用和使用的对象?这就像您正在创建一个神奇的黑匣子,它在幕后执行您无法跟踪的事情,让您任由 GC 摆布。
但是,对象本身不会产生异常,正如已经多次指出的那样,这是一种完全有效的语法。虽然该对象确实存储在堆上,但在下次运行 GC 时它将被删除(如果该对象在那时完成了某些操作)。
无论如何,这是我对此的看法:X 在任何程度上我都不是权威,甚至可能是新手。从此链接获得了有关 GC 的大部分信息:
http://javarevisited.blogspot.nl/2011/04/garbage-collection-in-java.html