Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

finalize не вызывается

1.9K
13 января 2007 года
HEvgA
49 / / 16.09.2004
Здрасте.
Есть такой вот код
Код:
public class FileLog {

    private FileWriter fileWriter;
        public FileLog(String fileName){
            try {
                fileWriter = new FileWriter(fileName + ".log");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


        public void line(String text) {
            try {
                fileWriter.write(text + "\n");
            } catch (IOException e) {
                e.printStackTrace();
            }
           
        }


           
           
        public void finalize() {
                try {
                    fileWriter.flush();
                    fileWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
               
            }

}


и класс который вызывает ето все

 
Код:
public class App {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Log l = new FileLog("log");
        l.line("qweqwe");
    }

}


так вот после завершении работы в логе нет ничего, finalize не вызвался!, или просто не успел, он вызывается если около сотни создать таких экземпляров, то у первых только начинает вызываться finalize. Как сделать чтоб этот код сработал как в C++. В в отличии от явы у с++ диструктор вызывается сразу. Или что-то я делаю не правильно?
391
14 января 2007 года
Archie
562 / / 03.02.2005
Так, видать, сборщик мусора не счел нужным прибирать этот объект. Попробуй вызвать GC насильно, при этом нужно "потерять" все ссылки на объект, чтобы он был уничтожен сборщиком мусора. Например, так:
 
Код:
Log l = new FileLog("log");
l.line("qweqwe");
l = null;
System.gc();
System.runFinalization();
16K
15 января 2007 года
WandM
46 / / 13.11.2006
Цитата: HEvgA
так вот после завершении работы в логе нет ничего, finalize не вызвался!


Правильно! Зачем собирать мусор, если дом рушится?
Даже если ты потеряешь все ссылки на объект, то не факт, что finalize вызовется сразу (а может, вообще не вызовется).
Поэтому не стоит на него очень рассчитывать.
System.gc(); в данном случае поможет, но все-таки...

3.7K
15 января 2007 года
bioflash
169 / / 01.10.2005
WandM прав. Если читать Java docs, то там пишет что нет гарантии что для каждого об'єкта будет визван finalize(). А надеятся на код которий приведен више не стоит, потому-что никто не может бить уверен что где-то нету еще посилания на етот об'єкт!!!

По-етому, я думаю лучше стоит пересмотрить више описаний принцип написания класов.
391
15 января 2007 года
Archie
562 / / 03.02.2005
Вот еще в спецификации у Sun-а написано такое:
Цитата:

A Java program can specify that the finalizers of all objects that have finalizers that have not been automatically invoked are to be run before the virtual machine exits. This is done by invoking the method runFinalizersOnExit of the class System with the argument true. The default is to not run finalizers on exit, and this behavior may be restored by invoking runFinalizersOnExit with the argument false. An invocation of the runFinalizersOnExit method is permitted only if the caller is allowed to exit, and is otherwise rejected by the security manager.


http://java.sun.com/docs/books/vmspec/html/Concepts.doc.html#24377

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог