Как отладить метод переопределения finalize () в Java?

Как мы знаем об этом вроде ...

Java.lang.Object.finalize () вызывается сборщиком мусора для объекта, когда сборщик мусора определяет, что больше нет ссылок на объект. Подкласс переопределяет метод finalize для удаления системных ресурсов или выполнения другой очистки. Также метод finailze () должен быть переопределен для объекта, чтобы включить код очистки или удалить системные ресурсы, которые должны быть выполнены до того, как объект будет собран сборщиком мусора.

Итак, я создал класс и переопределил в нем метод finalize () с некоторым моим кодом, как показано ниже, поскольку моя основная концепция - записать все данные, которые мой класс содержит, в конце, как перед закрытием формы в текстовом файле, чтобы сохранить его. ...

public class MainClass
{
    public static void main(String[] args) {
        NewDEMOClass obj = new NewDEMOClass();
        obj.AddValueToMap("A",1);
        obj.AddValueToMap("B",2);
        obj.AddValueToMap("C",3);
        // Many Value Added Here...         
    }    
}

Тогда мой собственный класс ...

public class NewDEMOClass
{
    private Map<String, Integer> customDictionary = new HashMap<String, Integer>();

    public NewDEMOClass()
    {   

    }

    public AddValueToMap(String Key, Integer Value)
    {   
        customDictionary.put(Key, Value);
    }           

    @Override
    protected void finalize()
    {
        String totalWord = "";
        for ( Map.Entry<String, Integer> entry : customDictionary.entrySet() ) {
            totalWord += entry.getKey() + "-" + entry.getValue() + System.lineSeparator();
        }
        while (true)
        {
            try(
                PrintWriter out = new PrintWriter("customDictionary.txt", "UTF-8")  ){
                out.println( totalWord );
                break;
            } catch (FileNotFoundException ex) {
                Logger.getLogger(AutoUrduPredictorAndSuggester.class.getName()).log(Level.SEVERE, null, ex);
            } catch (UnsupportedEncodingException ex) {
                Logger.getLogger(AutoUrduPredictorAndSuggester.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

Итак, моя основная проблема и вопрос заключается в том, что я хочу построчно отлаживать внутренние коды метода finalize(), чтобы увидеть ошибки и т. Д. Но я не могу добавить точку останова, поскольку использую среду IDE NetBeans. Так что же теперь делать и как ... ???


person Sahar Jabeen    schedule 31.12.2016    source источник
comment
Зачем вам нужен отладчик, чтобы видеть ошибки? Это как раз то, для чего существует регистратор, среди прочего ... И finalize-метод с бесконечным циклом, безусловно, одна из худших идей, которые я мог придумать. Что касается проблемы с netbeans: просто используйте другой отладчик (работает в IntelliJ, я думаю, JDB также поддерживает это). И, наконец, что не менее важно, использование finalize в целом плохо. Вместо этого используйте обычный метод.   -  person Paul    schedule 31.12.2016
comment
Вы просто никогда не должны переопределять finalize (). Это так просто. Если вам нужно это сделать, используйте обычный метод и при необходимости вызывайте его.   -  person JB Nizet    schedule 31.12.2016
comment
У вас не так много гарантий относительно finalize(): вы не можете знать когда, вы не можете знать кто (какой поток), и вы даже не можете быть уверены в этом будет называться вообще.   -  person Jack    schedule 31.12.2016
comment
Я просто хочу записать свои данные, когда приложения полностью закроются. Так будет метод finalize() работать или все еще нет? Есть ли какие-либо предложения по моей идее, кроме finalize() метода достижения того, что я хочу?   -  person Sahar Jabeen    schedule 31.12.2016
comment
Нет, у вас нет никакой гарантии, что метод finalize () когда-либо будет вызван. Как я уже сказал, если вам нужно что-то сделать, когда ваше приложение закрывается, тогда вызывайте метод явно, когда ваше приложение закрывается.   -  person JB Nizet    schedule 31.12.2016
comment
@JBNizet Спасибо за ваш ответ и предложение. Пожалуйста, добавьте его в ответ с подробным описанием ограничений и предостережений, чтобы я мог его выбрать.   -  person Sahar Jabeen    schedule 31.12.2016
comment
Этот finalize метод не делает того, что должен: высвобождает ресурсы. Вместо этого он выделяет кучу новых вещей и выполняет всевозможные операции ввода-вывода и другие сумасшедшие вещи. Предполагается, что финализаторы избавляются от ресурсов в периоды нехватки памяти, а не тратят их впустую.   -  person Lew Bloch    schedule 01.01.2017
comment
Попробуйте использовать ShutDown Thread вместо finalize(), как показано ниже в вашем конструкторе классов ... `Runtime.getRuntime (). AddShutdownHook (new Thread (new Runnable () {public void run () {functionThatShouldWorkInFinalize ();}}, Shutdown-thread )); `   -  person Muhammad Hassan    schedule 02.01.2017