Я использовал этот код: 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;
}
}
Очевидно, что если вы завершаете работу, когда первый экземпляр объекта находится в процессе, онвыдаст ошибку, о которой я говорю.После этого, скажем, в третьем экземпляре объекта будет напечатана информация о предыдущем объекте (в нашем случае второй).Это не сохранение последнего экземпляра.Должен ли я создать пустой инициализатор, а затем обработку?Судя по всему, экземпляр не сохраняется в главном из-за этого.