3

假设我们有一些如下所示的代码(我知道这是不好的做法):

try {

new myObject();

} catch {

//stuff

}

返回的对象会发生什么?它仍然存储在堆上吗?这应该引发编译时错误吗?

4

5 回答 5

7

它被创建,然后立即有资格进行垃圾收集。

我看不出它应该抛出异常的任何理由(当然,除非MyObject构造函数抛出异常),这是完全合法的语法。

于 2013-05-08T22:30:21.933 回答
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() 它将覆盖以前的引用等

于 2013-05-08T22:36:46.663 回答
2

它将有资格进行垃圾收集。不需要立即进行垃圾收集。

于 2013-05-08T22:31:29.843 回答
0

它不会抛出异常,因为它可以是完全有效的代码。该对象的构造函数可能会产生副作用。它可以写一个文件。它可以增加一个静态变量。它可能会改变你传入的对象。

于 2013-05-08T22:34:01.543 回答
0

该对象不会立即被标记为准备好进行 GC。只有当没有活动线程可以访问该对象时(在此上下文中),它才会被标记为这样。不过我真的不明白这样做有什么意义,开发人员不能直接调用 java 的 GC;它只会在 java 认为需要它时运行。

无论如何,为什么有人会创建一个在创建后无法直接引用和使用的对象?这就像您正在创建一个神奇的黑匣子,它在幕后执行您无法跟踪的事情,让您任由 GC 摆布。

但是,对象本身不会产生异常,正如已经多次指出的那样,这是一种完全有效的语法。虽然该对象确实存储在堆上,但在下次运行 GC 时它将被删除(如果该对象在那时完成了某些操作)。

无论如何,这是我对此的看法:X 在任何程度上我都不是权威,甚至可能是新手。从此链接获得了有关 GC 的大部分信息:

http://javarevisited.blogspot.nl/2011/04/garbage-collection-in-java.html

于 2013-05-08T22:41:01.657 回答