IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Equivalent de system("pause");


Sujet :

avec Java

  1. #1
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 145
    Points : 61
    Points
    61
    Par défaut Equivalent de system("pause");
    Bonjour,

    Je débute en Java et j'aimerai retrouver un équivalent de system("pause") en C.

    J'ai donc créer cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public static void pause(){
    		Scanner pause = new Scanner(System.in);
    		System.out.println("Appuyer sur une touche pour continuer...");
    		pause.nextLine();
     
    	}
    Je ne plus qu'a l'appeler dans le main avec pause(); et cela fonctionne parfaitement avec toutefois un petit warning :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ressource leak : 'pause' is never closed
    Après une petite recherche sur le net je vois qu'il suffit de rajouter pause.close(); pour résoudre le problème.

    Ce que je fait comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public static void pause(){
    		Scanner pause = new Scanner(System.in);
    		System.out.println("Appuyer sur une touche pour continuer...");
    		pause.nextLine();
                    pause.close();
     
    	}
    Plus de warning, mais plantage lors de la 2eme pause quand je lance le programme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Exception in thread "main" java.util.NoSuchElementException: No line found
    	at java.util.Scanner.nextLine(Unknown Source)
    	at poo.pause(poo.java:64)
    	at poo.main(poo.java:31)
    Si quelqu'un peux m'explique le pourquoi du comment ce serai très sympa.
    Merci !

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Ton Scanner utilise System.in
    Donc quand tu close() ton Scanner, tu close() aussi System.in
    Or on ne peut pas se servir d'une ressource sur laquelle on a appelé close()

    Ce qu'il faut, c'est créer un seul Scanner et ne le fermer qu'une seule fois. Donc dans ton cas, le créer au début du programme et le fermer à la fin.
    En fait, en réalité il n'y a pas besoin de fermer System.in (parce qu'on ne le ferme qu'à la fin et que c'est un flux de lecture, pas d'écriture, donc de toute façon ça va se faire tout seul.) Tu peux donc te passer de close() ton Scanner.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 145
    Points : 61
    Points
    61
    Par défaut
    Ok, donc je peux ignorer ce warning sans soucis.

    Merci

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par Almenor Voir le message
    Ok, donc je peux ignorer ce warning sans soucis.
    Non. Il faut créer un seul Scanner sur System.in
    Il ne faut pas en créer un chaque fois que tu veux attendre.

    Mais le close(), lui, n'est pas utile.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 145
    Points : 61
    Points
    61
    Par défaut
    Ha...

    Donc je dois mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Scanner pause = new Scanner(System.in);
    en début du main et
    en fin de main. (comme ça plus de warning, c'est plus propre)

    Du coup ma méthode ne contient plus que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public static void pause(){
    		System.out.println("Appuyer sur une touche pour continuer...");
    	}
    et au final je dois quand même écrire 2 lignes pour "pauser"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    pause();
    pause.nextLine();
    Bon, on ne dois pas écrire "Appuyer sur une touche pour continuer..." à chaque fois, c'est déjà ça de gagné.

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Qu'est-ce qui t'empêche de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private static final Scanner pause = new Scanner(System.in);
    ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 145
    Points : 61
    Points
    61
    Par défaut
    Ho oui !!!!
    Merci !

    je l'ai insérer comme suis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import java.util.Scanner;
    public class poo {
    	private static final Scanner pause = new Scanner(System.in);
     
    	public static void main(String[] args) {
    		pause();
                    pause();
    	}
     
    	public static void pause(){
    		System.out.println("Appuyer sur une touche pour continuer...");
    		pause.nextLine();
    	}
    }
    Et plus besoin de close plus de warning !!

    Je suppose que c'est le private static qui pemet de l'utiliser dans toutes les méthodes et le final qui dois lui dire de se close à la fin du programme ?

    Désolé, comme je l'ai dit je suis débutant et j'ai pas encore saisi les différences entre les public, private, static, etc... là dessus je m'en retourne étudier !

    Encore merci.

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par Almenor Voir le message
    Et plus besoin de close plus de warning !!
    En fait ça ne change rien au close() et le warning n'aurait pas dû disparaître. Mais bon, il est inutile de fermer un flux en lecture qui doit rester ouvert jusqu'à la fin du programme. Alors tu fais bien comme tu veux.

    Citation Envoyé par Almenor Voir le message
    Je suppose que c'est le private static qui pemet de l'utiliser dans toutes les méthodes et le final qui dois lui dire de se close à la fin du programme ?
    Non.
    - Ce qui permet de le lire dans toutes les méthodes, c'est de ne pas l'avoir mis dans une méthode. De l'avoir mis directement dans la classe, quoi.

    - Vu que les méthodes sont static, il doit être static pour qu'elles puissent le voir. On dit que c'est une variable de classe.

    - private n'est là que pour la beauté du geste. Il empêche les autres classes de s'en servir, ce qui est bien car elles n'ont pas y toucher.

    - final n'est aussi là que pour la beauté du geste. Il t'empêche d'assigner la variable pause plus d'une fois, ce qui est bien car on n'en veut qu'un seul du début à la fin du programme.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Perso ce qui me gène c'est d'utiliser Scanner, alors qu'il suffit de lire directement dans System.in :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	public static void pause() {
    		System.out.println("Appuyer sur une touche pour continuer...");
    		try {
    			while ( System.in.read() != '\n' ) ;
    		} catch (IOException e) {
    			throw new RuntimeException(e);
    		}
    	}
    a++

  10. #10
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Bah... in.nextLine() est tout de même nettement plus court et clair que while ( System.in.read() != '\n' ) ;.
    Moi y a rien qui me choque. À la limite j'utiliserais plutôt un BufferedReader, mais bon. En plus ces solutions-là gèrent aussi les anciennes fins de lignes en \r just in case.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo