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();
}
}
}
finalize не вызывается
Есть такой вот код
Код:
и класс который вызывает ето все
Код:
public class App {
public static void main(String[] args) {
// TODO Auto-generated method stub
Log l = new FileLog("log");
l.line("qweqwe");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Log l = new FileLog("log");
l.line("qweqwe");
}
}
так вот после завершении работы в логе нет ничего, finalize не вызвался!, или просто не успел, он вызывается если около сотни создать таких экземпляров, то у первых только начинает вызываться finalize. Как сделать чтоб этот код сработал как в C++. В в отличии от явы у с++ диструктор вызывается сразу. Или что-то я делаю не правильно?
Код:
Log l = new FileLog("log");
l.line("qweqwe");
l = null;
System.gc();
System.runFinalization();
l.line("qweqwe");
l = null;
System.gc();
System.runFinalization();
Цитата: HEvgA
так вот после завершении работы в логе нет ничего, finalize не вызвался!
Правильно! Зачем собирать мусор, если дом рушится?
Даже если ты потеряешь все ссылки на объект, то не факт, что finalize вызовется сразу (а может, вообще не вызовется).
Поэтому не стоит на него очень рассчитывать.
System.gc(); в данном случае поможет, но все-таки...
По-етому, я думаю лучше стоит пересмотрить више описаний принцип написания класов.
Цитата:
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