Qu'est-ce qu'une exception NumberFormatException et comment puis-je la réparer?
Error Message:
Exception in thread "main" java.lang.NumberFormatException: For input string: "Ace of Clubs"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at set07102.Cards.main(Cards.java:68)
C:\Users\qasim\AppData\Local\NetBeans\Cache.1\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 0 seconds)
Ma Boucle While:
while (response != 'q' && index < 52) {
System.out.println(cards[index]);
int first_value = Integer.parseInt(cards[index]);
int value = 0;
//Add a Scanner
Scanner scanner = new Scanner(System.in);
System.out.println("Will the next card be higher or lower?, press q if you want to quit");
String guess = scanner.nextLine();
if(cards[index].startsWith("Ace")) { value = 1; }
if(cards[index].startsWith("2")) { value = 2; }
if(cards[index].startsWith("3")) { value = 3; }
//checking 4-10
if(cards[index].startsWith("Queen")){ value = 11; }
if(cards[index].startsWith("King")){ value = 12; }
if(guess.startsWith("h")){
if(value > first_value){ System.out.println("You answer was right, weldone!"); }
else { System.out.println("You answer was wrong, try again!"); }
} else if(guess.startsWith("l")){
if(value < first_value) { System.out.println("You answer as right, try again!"); }
else { System.out.println("You answer was wrong, try again!"); }
} else { System.out.println("Your was not valid, try again!"); }
scanner.close();
index++;
}//end of while loop
source d'informationauteur Qasim Imtiaz
Vous devez vous connecter pour publier un commentaire.
signifie:
En d'autres termes, vous avez essayé d'analyser
"Ace of Clubs"
à unint
ce que Java ne peut pas le faire avec la méthodeInteger.parseInt
. Java a fourni de belles stacktrace qui vous indique exactement quel est le problème. L'outil que vous recherchez est débogueur et à l'aide de points d'arrêt va vous permettre d'inspecter les état de la demande à l'instant.La solution pourrait être la suite logique dans le cas où vous souhaitez utiliser analyse:
Qu'est ce qu'un
Exception
en Java?-La Documentation
Constructeurs et utilisation dans les
Integer#parseInt
Ils sont importants pour la compréhension de la façon de lire le stacktrace. Regardez comment les
NumberFormatException
est levée à partir deInteger#parseInt
:ou plus tard si le format de l'entrée
String s
n'est pas analysée:Qu'est ce qu'un
NumberFormatException
?-La Documentation
NumberFormatException
extends
IllegalArgumentException
. Il nous dit qu'il est plus spécialiséIllegalArgumentException
. En effet, il est utilisé pour mettre en évidence que, bien que le type d'argument a été correct (String
) le contenu de laString
n'était pas numérique (a,b,c,d,e,f sont considérés comme des chiffres en HEXADÉCIMAL et sont légaux en cas de besoin).Comment puis-je résoudre ce problème?
Eh bien, ne le réparez pas le fait qu'il est lancé. C'est bien qu'il est lancé. Il y a certaines choses que vous devez considérer:
String
qui provoque uneException
unnull
?Ad. 1.
La première ligne d'un message est une information que l'Exception s'est produite et l'entrée
String
qui a causé le problème. La Chaîne suit toujours:
et est cité ("some text"
). Ensuite, on s'intéresse à la lecture de la stacktrace de la fin, comme les premières lignes sont généralementNumberFormatException
'constructeur, l'analyse de la méthode etc. Puis à la fin, il y est votre méthode dans laquelle vous avez fait un bug. Il sera souligné dans quel fichier il était appelé, et dans la méthode. Même une ligne de montage. Vous le verrez. L'exemple de la lecture de la stacktrace est au-dessus.Ad. 2.
Quand vous voyez que, au lieu de
"For input string:"
et l'entrée, il y a unnull
(pas"null"
) c'est à dire que vous avez essayé de passer la valeur null référence à un certain nombre. Si vous voulez réellement à traiter est 0 ou un nombre, vous pourriez être intéressé à mon autre post sur StackOverflow. Il est disponible ici.La description de la résolution inattendue
null
s est bien décrite sur StackOverflow fil Qu'est ce qu'un NullPointerException et comment puis-je résoudre ce problème?.Ad. 3.
Si le
String
qui suit le:
et est cité ressemble à un numéro à votre avis, il pourrait être un personnage de votre système ne sont pas décoder ou invisible de l'espace blanc. Évidemment" 6"
ne peut pas être analysée ainsi que"123 "
ne le peuvent pas. C'est à cause de ces espaces. Mais il peut se produire, que leString
ressemblera"6"
mais en fait c'est la longueur sera plus grande que le nombre de chiffres que vous pouvez voir.Dans ce cas, je suggère d'utiliser le débogueur ou au moins
System.out.println
et imprimer la longueur de laString
vous êtes en train d'analyser. Si elle montre de plus que le nombre de chiffres, essayer de passerstringToParse.trim()
à l'analyse de la méthode. Si elle ne fonctionne pas, copier l'ensemble de la chaîne après la:
et le décoder à l'aide de décodeur en ligne. Elle vous donne les codes de tous les personnages.Il y a aussi un cas que j'ai trouvé récemment sur
StackOverflow
que vous pouvez voir, l'entrée ressemble à un numéro comme"1.86"
et il ne contient que ces 4 personnages, mais l'erreur est toujours présente. Rappelez-vous, on ne peut qu'analyser des entiers avec #Integer#parseInt#. Pour l'analyse des nombres décimaux, il faut utiliser leDouble#parseDouble
.Autre situation, lorsque le nombre a beaucoup de chiffres. Il peut être, que c'est trop grand ou trop petit pour s'adapter à
int
oulong
. Vous voudrez peut-être essayernew BigDecimal(<str>)
.Ad. 4.
Enfin, nous arrivons à l'endroit où nous sommes d'accord, que nous ne pouvons pas éviter les situations où il est utilisateur de taper "abc" comme une chaîne numérique. Pourquoi? Parce qu'il peut. Dans un chanceux cas, c'est parce qu'il est un testeur ou tout simplement un geek. Dans un mauvais cas, c'est l'attaquant.
Que puis-je faire maintenant? Eh bien, Java nous donne
try-catch
vous pouvez effectuer les opérations suivantes:Qu'est ce qu'un
NumberFormatException
?Dans votre cas, en fonction de votre stack trace de cette exception a été levée par
Integer.parseInt(String)
ce qui signifie que la conditionString
ne contient pas de parseableinteger
. Et selon toujours la trace de la pile, c'est en raison du fait que vous avez essayé d'analyser leString
"As de trèfle" comme un entier qui ne peut pas fonctionner car il n'est pas leString
représentation d'un entier.Comment résoudre ce problème?
La plus simple et la méthode générique est d'attraper l'exception
NumberFormatException
Que cela fonctionne, mais l'interception d'une exception est lent, car il a besoin de construire la pile d'appel pour créer le
Exception
ce qui est coûteux, donc si vous pouvez éviter de le faire. En outre, vous aurez besoin de gérer l'exception correctement, ce qui n'est pas toujours évident.Ou vous pouvez utiliser un
regular expression
de vérifier d'abord si leString
correspond à
avec unInteger
mais il est tout à fait enclins à faire des erreurs que vous pouvez facilement utiliser un mauvaisregular expression
.Dans votre cas, une plus OO approche doit être utilisée au lieu de traiter avec
String
par exemple, vous pouvez utiliser unclass
ou unenum
pour représenter vos cartes au lieu de l'aide de simplesString
car il est beaucoup plus enclins à faire des erreurs comme vous l'avez déjà remarqué.Donc, si vous décidez d'utiliser une classe dédiée pour votre carte, votre code pourrait être:
Pour le costume et le rang de la carte, on peut utiliser un
enum
puisqu'il y a des quantités limitées de rang et les costumes.Puis
cards
serait un tableau deCard
au lieu d'un tableau deString
et pourrait être initialisé comme suivant:Si vous avez besoin de mélanger votre tableau de cartes, vous pouvez procéder comme suivant (veuillez noter que si vous décidez d'utiliser un
List
de cartes au lieu d'un tableau utilisez simplementCollections.shuffle(list)
)Ensuite, vous serez en mesure d'accéder directement à la valeur de votre carte avec
cards[index].getRank().getValue()
sans prendre le risque de recevoir une exception (à l'exception d'uneIndexOutOfBoundsException
si vous n'utilisez pas un bon indice).Ressemble
cards[]
est Chaîne tableau et que vous tentez de convertirAce of Clubs
à Entier.se produit lorsque vous essayez d'analyser une entrée qui n'est pas un Nombre en chaîne.
Dans votre cas, votre tentative d'analyser une chaîne de caractères (qui n'a pas de numéro ), en tant qu'Entier.
Comme il n'est pas possible
NumberFormatException exception s'est produite.
Un NumberFormatException est la façon dont Java a à vous dire "j'ai essayé de convertir un String en int et je ne pouvais pas le faire".
Dans votre exception de trace, vous pouvez lire
Fondamentalement, cela signifie que, à la ligne 68 de votre code, vous appelez à l'Entier.parseInt méthode de passage "As de trèfle", comme paremeter. Cette méthode attend une valeur de type entier représenté comme une Chaîne de caractères, par exemple "4", de sorte que la méthode se plaint de jeter un NumberFormatException parce que "As de trèfle", ne semble pas un nombre entier à tous.
La première chose qui m'a jeté pour une boucle (no pun intended) a été vous avez été la limitation de la valeur de 1-13 quand il a besoin d'être 0-52. Aussi, avec votre logique, la valeur est toujours plus élevé. Une meilleure approche est avec un générateur de nombre. Voici mon code à l'aide d'un générateur de nombre (ou Java Aléatoire):
Comme pour le NumberFormatException je crois que Nicolas Filotto a fait un bon travail en expliquant que.
Un
NumberFormatException
signifie queInteger.parseInt()
ne pouvais pas traduire la chaîne en un nombre.Je dirais une des deux options:
Encapsuler les cartes comme un nom(chaîne de caractères)/valeur(int) combo. L'utilisation de la valeur de faire des comparaisons, et le nom de présenter les informations à l'utilisateur.
Cards[]
devient alors une liste de cartes, pas de chaînes.Analyser les chaînes de vous-même. Qui peut être plus facile, puisque vous avez déjà fait avec le
if(cards[index].startsWith("Ace")) { value = 1; }
bits. Vous pouvez déplacer ces dans une fonction appeléeCardToInt()
(ou autre), et utilisez cette fonction à la place deInteger.parseInt()
.alors que la rédaction de la déclaration ci-dessus, vous essayez d'analyser "As de trèfle" comme un nombre.
vous pouvez utiliser la méthode suivante pour tester si une chaîne peut être analysée comme un Entier:
Concernant votre question, qu'est-ce que NumberFormatException : Il est jeté pour indiquer que l'application a tenté de convertir une chaîne de caractères à l'un des types numériques, mais que la chaîne n'a pas le format approprié. (réf -http://docs.oracle.com/javase/7/docs/api/java/lang/NumberFormatException.html)
L'Exception qui vient dans votre code, où vous convertir la Chaîne en un Entier :
où vous passez une Chaîne de caractères comme "As de trèfle" qui n'est pas possible de convertir entier,de sorte qu'il jette Format de Nombre Exception. Vous pouvez utiliser,