博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如果finalize()抛出异常会怎样?
阅读量:7059 次
发布时间:2019-06-28

本文共 978 字,大约阅读时间需要 3 分钟。

hot3.png

finalize()抛出异常的时候会被忽略。而且,对象的终结将在此停止,导致对象处在一种不确定的状态。如果另一个进程试图使用这个对象的话,将产生不确定的结果。通常抛出异常将会导致线程终止并产生一个提示信息,但是从finalize()中抛出异常就不会。

我想实践一下finalize()方法,能提供一个范例吗?

class LargeObject{   byte[] memory = new byte[1024*1024*4];    @Override   protected void finalize() throws Exception   {      System.out.println("finalized");   }} public class FinalizeDemo{   public static void main(String[] args)   {      while (true)         new LargeObject();   }}

代码清单1:实践finalize()

代码清单1中的代码写了一个FinalizeDemo程序,重复地对largeObject类实例化。每一个Largeobject对象将产生4M的数组。在这种情况下,由于没有指向该对象的引用,所以LargeObject对象将被GC回收。

GC会调用对象的finalize()方法来回收对象。LargeObject重载的finalize()方法被调用的时候会想标准输出流打印一条信息。它没有调用父类的finalize()方法,因为它的父类是Object,即父类的finalize()方法什么也不做。

编译(javac FinalizeDemo.java)并运行(java FinalizeDemo)代码清单1.当我在我的环境下(64位win7平台)使用JDK7u6来编译运行的时候,我看到一列finalized的信息。但是在JDK8的环境下时,在几行finalized之后抛出了java.lang.OutOfMemoryError

因为finalize()方法对于虚拟机来说不是轻量级的程序,所以不能保证你一定会在你的环境下观察到输出信息。

转载于:https://my.oschina.net/u/1412027/blog/269619

你可能感兴趣的文章
微软勉强地向Linux作出了用户妥协
查看>>
Twitter的RPC框架Finagle简介
查看>>
时速企业邮箱告诉您搭建企业邮箱服务器需要哪些配置?
查看>>
OAuth的机制原理讲解及开发流程
查看>>
微积分导论--Limit
查看>>
使用PHP Socket 编程模拟Http post和get请求
查看>>
memcached的使用-----php中的常规操作
查看>>
Myeclipse中字符编码的统一设置(以utf-8为例)
查看>>
C++入门学习——虚函数表介绍
查看>>
事件冒泡
查看>>
VS2008 快捷键大全
查看>>
字符串格式化1
查看>>
Base58 随机UUID
查看>>
npm 安装的模块不知道怎么用
查看>>
app收纳盒子-欢迎吐槽
查看>>
近期计划
查看>>
终于找到了这个原文
查看>>
CentOS 6.4配置中文输入法
查看>>
springmvc 参数注解
查看>>
javascript prototype笔记(其二)
查看>>