假设我们有一些代码如下所示(我知道这是不好的做法):
try {
new myObject();
} catch {
//stuff
}
返回的对象会发生什么?它仍然存储在堆上吗?这会抛出编译时错误吗?
答案 0 :(得分:7)
它已创建,然后立即有资格进行垃圾回收。
我没有看到为什么它应该抛出异常的任何原因(当然,除非MyObject
构造函数抛出一个异常),这是完全合法的语法。
答案 1 :(得分:3)
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(),它将覆盖先前的引用,等等
答案 2 :(得分:2)
它有资格进行垃圾收集。没有必要立即进行垃圾收集。
答案 3 :(得分:0)
它不会抛出异常,因为它可以是完全有效的代码。该对象的构造函数可能有副作用。它可以写一个文件。它可以增加一个静态变量。它可以改变你传入的对象。
答案 4 :(得分:0)
对象未立即标记为GC准备就绪。只有当没有可以访问对象的活动线程时(在此上下文中),它才会被标记。我没有看到这样做的重点,但是开发人员不能直接调用java的GC;它只会在java认为需要时运行。
为什么有人会创建一个在创建后无法直接引用和使用的对象呢?这就像你正在创造一个神奇的黑匣子,可以在幕后做你无法追踪的事情,让你受到GC的怜悯。
对象本身不会生成异常,它已经多次被注释,是一种完全有效的语法。该对象确实存储在堆上,但是在GC的下一次运行时它将被删除(如果该对象在那时完成了操作)。
无论如何,这是我对此的看法:X我在任何程度上都不是权威,甚至可能是新手。从这个链接获得了大部分有关GC的信息:
http://javarevisited.blogspot.nl/2011/04/garbage-collection-in-java.html