zoukankan      html  css  js  c++  java
  • Try finally的一个实验和为什么避免重载 finalize()方法--例子

    public class TryFinallTest {
    
    public TryFinallTest(){
    
    }
    public void runSomething(String str){
    System.out.println(str);
    }
    
    public static void typeOne(){
    
    TryFinallTest one = new TryFinallTest();
    try{
    one.runSomething("runing something");
    return;
    }finally{
    one.runSomething("do final work");
    }
    }
    public static void main(String[] args){
    
    TryFinallTest.typeOne();
    }
    }
    输出结果:
    runing something
    do final work
    也就是,只要存在try finally,那么,finally包围的语句块一定会执行。
     
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    <<effectiva Java>>中提到,避免使用finalize方法来执行资源清理工作,避免使用finallize方法。
    那么,为什么?
    例子1:
    public class TryCatchFinallyTest implements Runnable {
    
    private void testMethod() throws InterruptedException {
    try {
    System.out.println("In try block");
    throw new NullPointerException();
    } catch (NullPointerException npe) {
    System.out.println("In catch block");
    } finally {
    System.out.println("In finally block");
    }
    }
    
    @Override
    protected void finalize() throws Throwable {
    System.out.println("In finalize block");
    super.finalize();
    }
    
    @Override
    public void run() {
    try {
    testMethod();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    
    ////////////////////////////////
    public class TestMain2 {
    @SuppressWarnings("deprecation")
    public static void main(String[] args) {
    for (int i = 1; i <= 3; i++) {
    new Thread(new TryCatchFinallyTest()).start();
    }
    }
    }
    输出结果:
    In try block
    In try block
    In catch block
    In finally block
    In catch block
    In finally block
    In try block
    In catch block
    In finally block
     
    我们是期望,finalize方法会被执行的。但是,finalize方法没有被执行。finalize方法,是在该对象被GC回收的时候,被GC调用执行的,而我们不知道GC什么时候进行垃圾回收。
    Called by the garbage collector on an object when garbage collection determines that there are no more references to the object.
     
    面对这种,依赖于GC,依赖于GC的回收才执行的方法,除非,你真的有需要,否则,我也觉得,不要使用。
     
    引用:
  • 相关阅读:
    Fedora kde桌面安装拼音输入法
    人大金仓数据库添加外键,删除外键
    东方通 TongWeb 远程调试相关脚本
    IDEA快捷键提示插件
    使用 url.openConnection、IOUtils.write 从网站下载文件与本地文件对比
    CAS服务端返回用户ID等扩展信息
    libvirt 启用TCP远程连接,windows平台java调用示例
    virsh创建虚拟机
    etcd_dbsize 只能使用2G限制修改
    通过备份 Etcd 来完美恢复 Kubernetes 中的误删数据
  • 原文地址:https://www.cnblogs.com/ttylinux/p/6537009.html
Copyright © 2011-2022 走看看