Pb d'erreur avec java

Résolu
Profil bloqué -  
 Profil bloqué -
Bonjour, j'ai un problème avec un code source que je programme en ce moments je suis entrain d'essayer d'afficher salut en 3 langues selon le choix et voila mon code source:

public class salut {
public static void main(String[] args){

char langue,fr,ar,en;;
switch (langue){
case'fr':
System.out.println("salut");
break;
case'en':
System.out.println("Hello");
break;
case'ar':
System.out.println("assalamou alikoum");
break;
default:
System.out.println("erreur");
break;



}

}
}

mais le problème c'est que on m'affiche erreur au dessu de "fr" comme etant un charactere invalide j'ai essayer de le mettre comme commentaire mais l'erreur saute a "en" et j'ai tous essayer mais rien a faire si kelk1 a une proposition je suis preuneuse merci d'avance


A voir également:

8 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
On ne peux pas faire de switch sur des String !
2
Pacorabanix Messages postés 3248 Date d'inscription   Statut Membre Dernière intervention   663
 
oui...

RTFM ! (Read The Fucking Manual =) )

utilises des if () {} else if() {} else {}
0
Giorgiolino Messages postés 253 Date d'inscription   Statut Contributeur Dernière intervention   52
 
Pour aller encore dans ton sens, trouvé sur ce site :

L'instruction switch ne fonctionne que sur des types simples (int, short, char ou byte) !

https://www.commentcamarche.net/contents/552-java-les-structures-conditionelles
0
oliver3923 Messages postés 971 Date d'inscription   Statut Membre Dernière intervention   143
 
zut j'avais fait une super explication et fausse manip j'ai éffacé sans être sur mon texte résultat... page précédente

bref je le refait en plus court

pour ton switch il te faut une (et une seule) variable

dans ton cas ca sera langue (tu dois l'initialiser a une valeur contenu dans ton switch donc dans ton cas ca sera fr, en, ou ar)
il y a 2 lettres donc langue n'est pas de type char mais String (c'est une chaine)

ensuite dans ton switch tu as le cas 1 langue = fr, cas 2 langue = en, cas 3 langue = ar.
default (aucun des trois) : erreur

en aucun cas ces trois possibilités (fr, en et ar) ne sont des variables, ce sont les valeurs possibles de ta variable langue et tu ne dois pas les déclarer

essaie de voir ton switch comme un if, else if, else

dans ton cas tu aurais
if (langue == fr)
...
else if (langue == en)
...
else if (langue == ar)
...
else
erreur

en oubliant pas les {}que je n'ai pas mis^^

avec ce if tu ne déclarerais pas fr en et ar
c'est la même chose avec ton switch

en gros un switch est comme un if a quelques différences près :
on l'utilise en général quand on a plus de choix différents possibles (3-4 ca passe avec un if, plus ca devient ingérable)
on ne peut pas utiliser plusieurs variables en même temps (je ne sais pas si tu l'a déja fait mais dans un if on peut mettre if (variable1 == 1 OU variable2 == 5) par exemple a part le ou et le et qui se remplacent par des symboles (|| pour ou et && pour et))

pour résumer (mais lis quand même le reste ca te servira^^) tu dois déclarer ta variable langue de type String puis dans ton switch mettre tes différentes possibilités comme tu le ferais avec un if en respectant la syntaxte du switch (qui est juste dans ton code a part les quotes ('') qu'on ne met pas pour des chaines)

voila j'espère que tu comprend mieux (et surtout n'abandonne pas les switchs finiront par te servir vraiment si tu veux faire des codes assez gros pcq au bout d'un moment tu verras que des if else if finissent par devenir ingérable si tu as trop de possibilités)
2
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
On peux également transformer (presque par magie) des Strings en int pour pouvoir les switcher mais ça nécessite une petite étape préliminaire (que j'ai mis en commentaire dans le main)
J'ai également mis le gros truc qui te manque c'est à dire utiliser les arguments pour que les valeurs varient !

public class Salut 
{ 
	protected static void convertir(String langue)
	{
		System.out.println(langue+"\t"+langue.hashCode());
	}
	
	private static final int 
		fr=3276, // convertir("fr")
		en=3241, // convertir("en")
		ar=3121; // convertir("ar")
		
	public static void main(String [] args)
	{
		/*
		convertir("fr"); // 3276
		convertir("en"); // 3241
		convertir("ar"); // 3121
		*/
		//*
		if (args.length==0)
		{
			System.err.println("Un argument de langue requis !");
			return;
		}
		
		int langue = args[0].hashCode();

		switch (langue)
		{ 
		case fr:
			System.out.println("Salut !"); 
			break;
		case en: 
			System.out.println("Hello"); 
			break;	
		case ar: 
			System.out.println("assalamou alikoum"); 
			break;	
		default: 
			System.out.println("'"+langue+"' n'est pas une langue reconnue");
			System.out.println("Langues acceptées : 'fr', 'en', 'ar'");
		}
		//*/
	} 
} 
0
oliver3923 Messages postés 971 Date d'inscription   Statut Membre Dernière intervention   143
 
vu qu'il a du mal avec les switch c'est peut être pas le moment de l'embrouiller avec des fonction^^
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Si utiliser une fonction l'embrouille, autant changer de voie maintenant et s'orienter vers la pâtisserie ^^
0
oliver3923 Messages postés 971 Date d'inscription   Statut Membre Dernière intervention   143
 
oui mais faut qu'il apprenne a s'en servir avant sinon il va pas piger ton code

d'ailleurs ca sert a quoi hashCode()?
je connais pas comme fonction^^
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Le hashcode sert principalement pour les collections implémentées avec des tables de hachage comme HashTable, HashMap, HashSet...

En fait il est plus efficace de travailler dans des collections de données triées. On peut ainsi faire des manipulations plus rapides sur ces collections. Le problème c'est qu'il serait en général trop lourd de comparer à chaque fois toutes les données de deux objets pour savoir s'ils sont égaux.
On se sert donc de hashcode qui permet de déduire rapidement une propriété de l'objet. Ça donne un entier tel que deux objets égaux ont le même hashcode. Attention, pour deux hashcodes identiques on peux avoir deux objets différents, dans ce cas là on est obligé d'appeler la méthode equals pour comparer totalement les objets, mais dans la plupart des cas on peut s'en passer car on aura trouvé avant que le hashcode est différent.

Ici c'est ce que je fais, plutôt que de comparer les String : if (s1.equals(s2)) j'utilise directement le hashcode car c'est un entier et peut donc être switché : switch (s1.hashCode()) case s2.hashcode() :
Il est évident que l'on pourrait avoir d'autre String que "fr" qui ait le hashcode 3276, mais il faudrait vraiment le faire exprès pour tomber dessus, alors que par contre on est sûr que si langue est égal à "fr" on aura bien son hashcode à 3276, et du coup on peux s'en servir dans le switch...

Comme je le disais c'est un peu magique, mais ça marche ^^
Remarque : pour "fr" on a 3276, car 'f'=102, 'r'=114, et que hashcode=102*31+114.
Je ne sors pas la formule du néant, elle est dans la documentation...
À voir donc : Object.equals(Object), Object.hashcode(), et en particulier String.hashcode()
0
Profil bloqué
 
j'ai essayer ca:
public class salut {
public static void main(String [] args){
String fr;
String ar;
String en;

char langue = 0;
switch (langue){
case 'f':
System.out.println("salut");
break;
case 'e':
System.out.println("Hello");
break;
case 'a':
System.out.println("assalamou alikoum");
break;
default:
System.out.println("erreur");
break;



}

}
}

mais le problème est tjr persistant on m'affiche le 3em print "erreur"
et kan j'essaye autre chose genre:

public class salut {
public static void main(String [] args){
String fr;
String ar;
String en;

char langue;
switch (langue){
case 'fr':
System.out.println("salut");
break;
case 'en':
System.out.println("Hello");
break;
case 'ar':
System.out.println("assalamou alikoum");
break;
default:
System.out.println("erreur");
break;



}

}
}

la 1er erreur revient sur "fr" on m'écrit: Invalid character constant!!!!
je c pas quoi faire on m'a conseiller de travailler avec les arguments mais j'ai pas cu comment je voulait afficher un msg qui permet de choisir la langue fr en ou ar puis qui affiche le msg selon la langue choisi alor si quelqu'un pourrait trouver la source de l'erreur ou bien sait comment travailler avec les arguments ou meme a une touts autre solution je suis preunneuse a 200000000000000000000% merci
1
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Tu ne modifies jamais ton char langue, il vaut toujours 0 ou alors n'est pas initialisé, et ça ne correspond à aucun des cas filtrés par ton switch il est donc évident qu'il rentre toujours dans le default qui t'affiche "erreur" ou alors ça plante car comme on te la déjà dit les caractères ne doivent avoir qu'une seule lettre !
0
Pacorabanix Messages postés 3248 Date d'inscription   Statut Membre Dernière intervention   663
 
en fait il y a un problème, des char c'est UN caractère 'f' ou 'a' . Pour plusieurs caractères, il te faut des String. "fr"
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Profil bloqué
 
mais le problem c que j'ai mis string et c tjr pareil !!!
0
oliver3923 Messages postés 971 Date d'inscription   Statut Membre Dernière intervention   143
 
char langue,fr,ar,en;;

si c'est un copié collé de ton code tu déclare 4 variables de type char alors qu'il faudrait des String

String langue;

et ton switch comme tu l'as mis sans les quotes (c'est pas des caractères)
par contre je suis pas sur que le switch marche avec les String faudra voir quand t'auras corrigé (j'ai pas le courage de tester^^)

et évite de mettre 2 ; ton compilateur risque de pas aimer^^
0
malaik5 Messages postés 258 Date d'inscription   Statut Membre Dernière intervention   33
 
bonjour,
le probleme est que tu n'as pas besoin de 4variables pour faire ton switch, une seule suffirait (laisse la variable langue), à cette derniere tu affecte une valeur que tu veux (fr, ar, ang ...) et c'est cette valeur que tu vas faire ton switch

dans ton code tu declare fr, ar, .. comme etant des varibales hors que tu les mets comme etant des chaines (et meme pas puisque tu les met entre ' '), du coup ça genere des erreurs.
0
Profil bloqué
 
merci oliver3923 c vrement tro gentil de ta part en plus ta reponse ma becoup aider a voire le vrai sens du switch merci encor
0
Pacorabanix Messages postés 3248 Date d'inscription   Statut Membre Dernière intervention   663
 
et tu verras, l'histoire qu'une variable doit être remplie par quelque chose, et qu'on oublie de le faire, ça revient très souvent en programmation, pas qu'avec le switch.

bonne continuation
0
Profil bloqué
 
merci c très gentil de ta part
0