Удаляет ли сборщик мусора объекты перед выполнением addShutdownHook? - PullRequest
0 голосов
/ 30 января 2019

Я использовал этот код: https://www.tutorialspoint.com/java/lang/runtime_addshutdownhook.htm - чтобы сохранить критические данные после завершения.Однако я получаю сообщение об ошибке:

Exception in thread "Thread-0" java.lang.NullPointerException

Это происходит, когда я пытаюсь вернуть экземпляр объекта, процесс которого был завершен.Чтобы уточнить, данные, которые я возвращаю, были инициированы, то есть они имеют некоторые значения по умолчанию.Таким образом, он должен по крайней мере возвращать значения по умолчанию, но не ошибку.Мое единственное объяснение - думать, что это все из-за GC.

Должен ли я использовать try{}catch{}finally{} для сохранения критических данных?Или addShutdownHook должен нормально работать с методом, который я описываю, поэтому я должен либо предоставить больше информации о коде, либо попытаться найти ошибку в моем коде?

EDIT 1:

Использование этого как моего основного:

public class Main {
private static Object objectInstance;
// a class that extends thread that is to be called when the program is exiting
static class Message extends Thread {

    public void run() {
        System.out.println("Object " + objectInstance.getTemporary()
                + " " + objectInstance.isExists());
        System.out.println("Bye.");
    }
}
public static void main(String[] args) {
    try {
        // register Message as shutdown hook
        Runtime.getRuntime().addShutdownHook(new Message());
        // print the state of the program
        System.out.println("Program is starting...");
        // call the object instances
        for (int i = 0; i < 5; i++) {
            System.out.println("Next...");
            objectInstance = new Object(i);
        }
        // print that the program is closing
        System.out.println("Program is closing...");
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

И это как мой объект:

public class Object {
private boolean exists = false;
private int temporary;
public Object(int temporary) {
    this.temporary = temporary;
    try {
        Thread.sleep(3000);
        // upon completion
        exists = true;
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
// returns to main
public boolean isExists() {
    return exists;
}
// return the index
public int getTemporary() {
    return temporary;
}
}

Очевидно, что если вы завершаете работу, когда первый экземпляр объекта находится в процессе, онвыдаст ошибку, о которой я говорю.После этого, скажем, в третьем экземпляре объекта будет напечатана информация о предыдущем объекте (в нашем случае второй).Это не сохранение последнего экземпляра.Должен ли я создать пустой инициализатор, а затем обработку?Судя по всему, экземпляр не сохраняется в главном из-за этого.

1 Ответ

0 голосов
/ 30 января 2019

Это исправляет мою проблему.Для основного:

for (int i = 0; i < 5; i++) {
     System.out.println("Next...");
     objectInstance = new Object(i);
     System.out.println("Initialised.");
     objectInstance.method();
}

Для объекта:

public Object(int temporary) {
    this.temporary = temporary;
}
public void method() {
    try {
        Thread.sleep(3000);
        // upon completion
        exists = true;
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

Спасибо !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...