Maitriser le java

Fermé
percydev Messages postés 5 Date d'inscription mardi 15 janvier 2013 Statut Membre Dernière intervention 30 mai 2013 - 15 janv. 2013 à 13:01
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 27 janv. 2013 à 01:21
Bonjour,
voici le code java,au fait eclipse n'affiche pas d'erreur de codage mais en compilant il souligne("reponse = sc.nextLine().charAt(0);")

import java.util.Scanner;

public class tableau3 {

public static void main(String[] args) {


int nbre = 0;

int i;


char reponse = 'O';

Scanner sc = new Scanner(System.in);

while (reponse == 'O')
{

System.out.println("Entrez la taille!");

nbre = sc.nextInt();

int [] tableauEntier = new int [nbre];

for (i=0 ; i<nbre ; i++)

{

System.out.println ("donnez le nombre numero " + (i+1) + " : " ) ;

tableauEntier[i] = sc .nextInt();
}
reponse = ' ';

while(reponse != 'O' && reponse != 'N')

{

System.out.println("Voulez-vous réessayer ? (O/N)");

reponse = sc.nextLine().charAt(0);

}

}
}
}







vérifier mon code et corriger le s'il vous plaît !
A voir également:

3 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
27 janv. 2013 à 01:21
Beaucoup de choses ont été dites, je veux juste préciser deux ou trois trucs :

Martoufff : "J'ai remplacé nextLine() par next()"
k.mestdagh : "Quand l'on fait un next(), java prend la ligne entrée au clavier à la console mais sans espace..."

La classe Scanner utilise des expressions régulières comme délimiteurs (ce qui sépare deux entrées successives), donc si la méthode nextLine fait toujours ce que l'on veut c'est parce qu'elle se base sur l'expression ".*(\r\n|[\n\r\u2028\u2029\u0085])|.+$"
En revanche, la méthode next est personnalisable, il suffit d'utiliser la méthode useDelimiter pour lui affecter n'importe quelle expression régulière (ce qui est un outil très puissant). Alors il se trouve qu'effectivement le délimiteur par défaut du Scanner filtre les espaces, il s'agit plus exactement du pattern "\p{javaWhitespace}+", mais attention, car ce délimiteur pouvant être changé n'importe où dans le programme, on ne peut pas remplacer nextLine par next n'importe comment (ce n'est pas parce qu'ici ça fonctionne, que c'est la bonne solution).

Alors pourquoi le code de percydev ne fonctionne pas ? Et bien en fait c'est à cause de la méthode nextInt, ou plus exactement des saut de lignes que l'on rajoute lorsque l'on valide la saisie en appuyant sur la touche Entrée. Cela rajoute un \n (ou \r\n) qui n'est pas évacué par le nextInt, et qui reste en suspens. Il faut donc évacuer ces \n avec autant de nextLine qu'il n'y a eu de nextInt, c'est le constat que faisais k.mestdagh quand il disait que "avec nextLine(), il te faudra dans certain cas le répété après la lecture pour stopper le buffer de lecture."
Ce que je préconise quand on manipule System.in (ou n'importe quel autre flux qui rajouterait des sauts de lignes intempestifs), c'est de faire suivre systématiquement les nextInt (mais également les nextLong, nextFloat, etc.) d'un nextLine qui évacuera immédiatement le \n de la touche Entrée, s'évitant ainsi bien des soucis.

Le problème de percydev se résout donc proprement comme ceci :

System.out.println("Entrez la taille!");
nbre = sc.nextInt(); sc.nextLine();
...
tableauEntier[i] = sc.nextInt(); sc.nextLine();
1
Martoufff Messages postés 18 Date d'inscription dimanche 13 janvier 2013 Statut Membre Dernière intervention 22 juillet 2014 4
20 janv. 2013 à 01:58
Bonjour,


je suis débutant tout comme vous en Java ...

J'ai remplacé nextLine() par next()

J'espère avoir pu vous aider.


Bonne fin de weekend !


PS: Si je puis me permettre, vous feriez bien d'indenter un peu plus votre code ça rend le tout bien plus lisible ... Après tout chacun sa technique ... :D
0
k.mestdagh Messages postés 39 Date d'inscription vendredi 10 décembre 2010 Statut Membre Dernière intervention 24 juillet 2015
27 janv. 2013 à 00:30
Martin,

Pour ton information aussi. Tu as raison dans ce cas-ci, mais il faut bien comprendre à quoi sert next() ou nextLine()....

Quand l'on fait un next(), java prend la ligne entrée au clavier à la console mais sans espace... Cad : dès que tu tape un espace, soit java ne le prendra pas en compte, soit il te lancera une exception. Je te conseil donc tout de même d'entourer ton code d'un try-catch,
Contraîrement à nextLine() qui prend une réelle ligne (y compris les espaces) jusqu'au \n du retour chariot.

Cependant avec nextLine(), il te faudra dans certain cas le répété après la lecture pour stopper le buffer de lecture.
0