Внезапное закрытие Java-приложения: как этого избежать?
Страница 3. Использование shutdown-ловушки


Использование shutdown-ловушки


В Листинге 3 приведен вариант этого же приложения, который разрешает эту проблему. Новый вариант приложения модифицирует код из Листинга 2, устанавливая shutdown-ловушку. Класс этой ловушки определяется как внутренний класс основного класса приложения. Таким образом, он получает доступ ко всем полям и методам основного класса. В Листинге 3 метод run класса-ловушки просто вызывает метод shutdown основного класса. Этим гарантируется его вызов по завершению приложения.

Листинг 3

package test;

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.File;
import java.io.IOException;

public class MySwingAppWith ShutdownHook extends JFrame {
JButton exitButton = new JButton();
JTextArea jTextArea1 = new JTextArea();

String dir = System.getPro perty("user.dir");
String filename = "temp. txt";

public MySwingAppWithShut-downHook() {
exitButton.setText("Exit");
exitButton.setBounds(new Rectangle(304, 248, 76, 37));
exitButton.addActionListener(new java.awt.event.Ac-tionListener() {
public void actionPer-formed(ActionEvent e) {
exitButton_actionPerformed(e);
}
});

this.getContentPane().set Layout(null);
jTextArea1.setText("Click the Exit button to quit");
jTextArea1.setBounds(new Rectangle(9, 7, 371, 235));
this.getContentPane().add (exitButton, null);
this.getContentPane().add (jTextArea1, null);
this.setDefaultCloseOpera-tion(EXIT_ON_CLOSE);
this.setBounds(0,0, 400, 330);
this.setVisible(true);
initialize();
}

private void initialize() {
//добавление shutdown-ловушки
MyShutdownHook shutdown Hook = new MyShutdownHook();
Runtime.getRuntime().addShutdownHook(shutdownHook);

//создание временного файла
File file = new File(dir, filename);

try {
System.out.println("Crea-ting temporary file");
file.createNewFile();
} catch (IOException e) {
System.out.println("Failed creating temporary file.");
}
}

private void shutdown() {
//удаление временного файла
File file = new File(dir, filename);
if (file.exists()) {
System.out.println("Dele-ting temporary file.");
file.delete();
}
}

void exitButton_action Performed(ActionEvent e) {
shutdown();
System.exit(0);
}

public static void main (String[] args) {
MySwingAppWithShutdown Hook mySwingApp = new My SwingAppWithShutdownHook();
}

private class MyShutdown Hook extends Thread {
public void run() {
shutdown();
}
}
}

Обратите внимание на метод initialize. Первое, что он делает - создает экземпляр внутреннего класса MyShut-downHook, который наследует класс Thread.
MyShutdownHook shutdown Hook = new MyShutdownHook();
Теперь, получив экземпляр класса MyShutdownHook, мы регистрируем его в Runtime с помощью метода addShut downHook:
Runtime.getRuntime().add ShutdownHook(shutdownHook);
Оставшаяся часть метода initialize в точности соответствует такому же методу из Листинга 2. В этой части создается временный файл и выводится строчка Creating temporary file.

Теперь попробуйте запустить это небольшое Swing-приложение. Убедитесь в том, что временный файл удаляется в любом случае, каким бы способом вы ни закрыли приложение.
Shutdown-ловушки, которые мы рассмотрели в этой статье, являются фактически единственным правильным решением проблемы выполнения какого-либо кода по завершению приложения. А поскольку нельзя быть уверенным в том, каким образом пользователь на этот раз закроет ваше приложение, их использование значительно облегчит вам жизнь, гарантируя выполнение установленных вами правил.

Budi Kurniawan 

 
« Предыдущая статья