当前位置: 首页 > 面试题库 >

构造函数抛出异常后可以调用finalize吗?

皇甫琛
2023-03-14
问题内容

是否有关于对象是否使用finalize()异常的构造函数清除的详细信息。

众所周知,定义此方法的时间很短。根据手册:

Java编程语言不能保证哪个线程将为任何给定对象调用finalize方法。但是,可以保证,调用finalize的线程在调用finalize时不会持有任何用户可见的同步锁。如果finalize方法抛出未捕获的异常,则该异常将被忽略,并且该对象的终止将终止。

http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#finalize%28%29

我无法以这种方式触发finalize方法。有谁知道构造器无法初始化对象(因此是异常)之后是否确实要调用它,或者在某些情况下是否调用了它。

我问这个问题是因为我有一个物体不能被清理两次。我试图了解在引发异常之前清理是否安全,或者是否必须留下标记finalize()以有效地跳过而什么也不做。


问题答案:

我的测试表明它可以

public class Test1 {

    Test1() {
        throw new RuntimeException();
    }

    @Override
    protected void finalize() throws Throwable {
        System.out.println("finalized");
    }

    public static void main(String[] args) throws Exception {
        try {
            new Test1();
        } catch (RuntimeException e) {
            e.printStackTrace();
        }
        System.gc();
        Thread.sleep(1000);
    }
}

版画

java.lang.RuntimeException
    at test.Test1.<init>(Test1.java:13)
    at test.Test1.main(Test1.java:24)
finalized

它在Java HostSpot客户端VM 1.7.0_03上



 类似资料:
  • 这是主要的方法: 运行时,这是堆栈跟踪:

  • 问题内容: 允许构造函数抛出异常吗? 问题答案: 是的,构造函数可以引发异常。通常,这意味着新对象可以立即进行垃圾回收(当然,尽管一段时间内可能不会收集到)。如果“半构造”对象在构造函数中较早可见(例如,通过分配静态字段或将其自身添加到集合中),则可能会留下痕迹。 在构造函数中引发异常时要注意的一件事:由于调用者(通常)将无法使用新对象,因此构造函数应注意避免获取非托管资源(文件句柄等),然后引发

  • 我有一个名为的类,它的构造函数可能会抛出。 现在我想为类实现线程安全的单例模式。通常,我通过将构造函数私有化来实现单例,创建一个与class类型相同的静态final变量,该变量也调用构造函数,然后使用getInstance方法来访问它: 问题是这种解决方案在这种情况下不起作用,因为构造函数抛出了一个检查异常。将checked exception更改为unchecked不是选项。解决办法是什么? 澄

  • 问题内容: 在C ++中,对象的生命周期从构造函数成功完成时开始。在构造函数内部,该对象尚不存在。 问:从构造函数发出异常是什么意思? 答:这意味着构造已失败,该物体从未存在,其寿命从未开始。[ 来源 ] 我的问题是:Java是否同样适用?例如,如果我移交给另一个对象,然后构造函数失败,会发生什么情况? 这个定义明确吗?现在是否有对非对象的引用? 问题答案: 该对象存在,但未正确初始化。 每当构造

  • 问题内容: 在下面的代码中: 从api 使用(in )和使用抛出错误(in )有什么区别? 完全一样吗? 如果相同,为什么我们需要回调呢? 问题答案: 从api 使用(in )和使用抛出错误(in )有什么区别? 是的,当是回调时,您不能异步使用。例如,一些超时: 完全一样吗? 不,至少在您的语句后面跟随其他代码时才不会。立即完成解析程序功能,同时调用继续正常执行-在“标记”了承诺被拒绝之后。 此

  • 在以下代码中: 在Promise api中使用(在中)和使用