2017-05-11 1 views
0

Je travaille sur une application console simple et j'ai le problème suivant: Je dois intercepter et exécuter une opération lorsque l'utilisateur ferme l'application (par exemple en cliquant sur CTRL + C dans le shell). D'après ce que j'ai compris, je peux utiliser la méthode addShutdownHook() sur mon runtime (mais je ne suis absolument pas sûr de cette assertion) mais ça ne marche pas pour moi.Comment intercepter et gérer correctement lorsque l'utilisateur quitte une application de console Java?

Je l'ai fait quelque chose comme ceci:

public class MainApp { 

    public static void main(String[] args) { 

     Runtime.getRuntime().addShutdownHook(new Thread() 
     { 
      @Override 
      public void run() 
      { 
       System.out.println("STOPPED !!!"); 
      } 


     }); 

     ................................................................... 
     ................................................................... 
     MY APPLICATION BEHAVIOR 
     ................................................................... 
     ................................................................... 
    } 
} 

Faire de cette façon, je pensais que l'application doivent commencer et puis lorsque l'utilisateur quitte l'application par CTRL + C il entrer dans la course () méthode définie dans le (nouveau fil)

ce qui se passe est que si je termine ma demande en appuyant sur CTRL + C l'application quitter b La méthode run() n'est pas exécutée et la fin de l'application n'est pas gérée.

Qu'est-ce qui ne va pas? Qu'est-ce que je rate? Comment intercepter correctement lorsque l'utilisateur quitte mon application de console?

+0

@RealSkeptic J'ai fait une mauvaise affirmation, j'ai édité mon article original. Fondamentalement ce qui se passe est que l'application commence normalement mais en la quittant par CTRL + C la fin de l'application n'est pas gérée et la méthode run() n'est pas exécutée –

+0

Vous devrez nous en dire plus sur la partie "APPLICATION BEHAVIOR". Qu'est ce que ça fait? Peut-être qu'il imprime beaucoup de choses, de sorte que vous ne voyez pas l'impression à partir du crochet d'arrêt? – RealSkeptic

Répondre

1

J'ai essayé le code ci-dessous et il travaille pour moi lorsque vous appuyez sur s'il vous plaît Ctrl + C noter que la méthode addShutDownHook() doit être appelée avant la presse utilisateur Ctrl + C, comme il est indiqué dans le docs:

Une fois que la séquence d'arrêt a commencé, il est impossible d'enregistrer un nouveau crochet d'arrêt ou de désenregistrer un hook précédemment enregistré. Tenter une de ces opérations provoquera une exception IllegalStateException à être levée.

public class MainApp { 

    public static void main(String[] args) { 
     Runtime.getRuntime().addShutdownHook(new Thread() { 
      @Override 
      public void run() { 
       try { 
        String text = "kkkk"; 
        Files.write(Paths.get("./fileName.txt"), text.getBytes()); 
        System.out.println("STOPPED !!!"); 
       } catch (IOException ex) { 

        ex.printStackTrace(); 
       } 
      } 

     }); 

     Scanner sc = new Scanner(System.in); 
     int i = sc.nextInt(); 

     System.out.println("the entered int: " + i); // will print the variable 



     System.out.println("my app behaviour"); 

    } 
} 

lorsque l'application démarre et j'appuyez sur Ctrl + C un fichier est écrit dans le répertoire en cours et je peux voir la sortie suivante:

Pedros-MacBook-Pro: stackoverflow pedro $ java -jar cible/stackoverflow-1.0-jar-avec-dependencies.jar ^ CSTOPPED !!!