Domanda

Sto valutando gli input dell'utente come comandi per la mia applicazione. Se l'utente preme Q o q , e poi colpisce immettere, l'applicazione si chiude e l'esecuzione termina.

Esiste un contesto appropriato, o le migliori pratiche su come farlo? Non ho alcuna risorsa per liberare, o qualcosa di simile. Devo solo usare System.exit(0);? Esiste un metodo consigliato per farlo?

Come il mio primo approccio che faccio qualcosa di simile:

while (true){
    try{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        //Other logic goes here...
        if (br.readLine().equalsIgnoreCase("Q")){
            System.exit(0);
        }
    }
    catch (IOException ioe) {
        System.out.println("IO error trying to read your selection");
    }
}
È stato utile?

Soluzione

Si potrebbe anche tornare fino a main() e tornare da lì.

    private void loop() {
        while (true){
           try{
               BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

               //other logic goes here...
               if(br.readLine().equalsIgnoreCase("Q")){
                   return; // You're done and you are returning to the caller.
               }
           }
           catch (IOException ioe) {
               System.out.println("IO error trying to read your selection");
           }
        }
    }

    public static void main(String[] args) {
        loop();
    }

Ma se non si ha nulla da rilasciare, System.exit(0) va bene.

Altri suggerimenti

Le risorse vengono ripuliti automaticamente dal sistema operativo quando il processo si chiude. Ci sono due ragioni principali per non solo exit () dalla metà del codice (questo vale per tutte le lingue).

  • Ci può essere qualche azione che deve essere presa prima della fine del programma. Ad esempio, potrebbe essere necessario salvare i file aperti (cioè scrivere le modifiche che, per le prestazioni o altri motivi non sono stati inviati al file ancora).

  • Qualcuno potrebbe voler utilizzare in seguito il codice per qualche altro scopo.

Prendete per esempio, il sistema di controllo versione Git. Ci sono diversi sforzi per trasformare il codice in una libreria, invece di una serie di eseguibili stand-alone in modo che possa essere efficientemente incorporati in altri progetti. Uno dei problemi (da quello che ho heared) è che il codice a volte semplicemente termina invece di monitoraggio e bonifica delle risorse che sta utilizzando. Come un eseguibile che va bene, ma se è stato importato come una libreria, non sempre desidera terminare solo l'applicazione host perché hai finito il tuo piccola parte.

Tornando tutta la strada fino a Tornando fuori main() è il modo più pulito, naturalmente, ma se questo non è facile da fare, System.exit() è perfettamente bene.

Non è direttamente pertinenti alla tua domanda, ma un'eccezione (non gestita) di solito è il modo per terminare su una condizione irreversibile , in quanto fornisce un sacco di tracciare informazioni ai poveri utenti.

Vorrei dire:

  

Non importa, è del tutto fino a   voi!

E impasto a volte è vero, altre volte dipende dall'integrità struttura e codice di programma.

L'uscita ragionevole sarebbe attraverso metodo main, chiude tutti i fili.

forze System.exit cessazione di tutti i thread nel JVM. Lo System.exit non ritorna mai normalmente. Esso dovrebbe essere utilizzato per un errore.

System.exit () va bene. E sono d'accordo con le altre risposte, tornando alla principale sarebbe il modo migliore per uscire - da un punto di vista della manutenzione. Il tuo codice si espande si può dimenticare il metodo poco facendo System.exit avere per eseguire il debug di ricordarla.

Tuttavia è solo bisogno di utilizzare l'uscita se si dispone di uno script che ha bisogno di informazioni su un anomala. In caso contrario, non v'è alcuna necessità.

Se non ricordo un programma Java uscirà con 0 per default - che significa la cessazione normale. Quindi, che ci si vuole utilizzare System.exit (n) per i casi in cui il programma termina a causa di qualche errore.

Esempio (solo utilizzando metodi statici che ci si molto probabilmente si desidera creare un'istanza ...):

public static void main(String[] args) {
   try {
     doStuff();
   } catch (SomeRuntimeException e) {
     // marching orders! Exit with errorcode
     <log the error with sufficient info for debugging>
     System.exit(1);
   }
}

private static doStuff() {
  // doing my thing ...
  ...
  //then some error occurs and I have no other choice but to do a hard exit
  throw new SomeRuntimeException(  ... some info would be nice ...)
  ...
  return
}

Non dimenticate che se si esegue un System.exit(), non è possibile facilmente in seguito utilizzare i metodi in una libreria autonoma. Se si vuole riutilizzare il codice di fuori della vostra soluzione esistente (e si potrebbe non ora, ma decide di farlo in futuro)? Allora ti quindi necessario rivisitare e refactoring in modo appropriato.

In caso contrario la peggiore delle ipotesi è che si prende il codice esistente senza notare le System.exit()s, usarlo e quindi avere la vostra uscita libreria inaspettatamente in una nuova applicazione.

Solo una cosa da tenere a mente re. code-riutilizzo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top