web-dev-qa-db-fra.com

Integer.parseInt exception de format de nombre?

Je sens que je dois manquer quelque chose de simple, mais je reçois un NumberFormatException sur le code suivant:

System.out.println(Integer.parseInt("howareyou",35))

Ideone

Il peut convertir la chaîne yellow à partir de la base 35, je ne comprends pas pourquoi j'obtiendrais un NumberFormatException sur cette chaîne.

23
Danny

Parce que le résultat sera supérieur à Integer.MAX_VALUE

Essaye ça

System.out.println(Integer.parseInt("yellow", 35));
System.out.println(Long.parseLong("howareyou", 35));

et pour

Long.parseLong("abcdefghijklmno",25)

vous avez besoin BigInteger

Essayez ceci et vous comprendrez pourquoi

System.out.println(Long.MAX_VALUE);
System.out.println(new BigInteger("abcdefghijklmno",25));
30
René Link

Depuis les JavaDocs:

Une exception de type NumberFormatException est levée si l'une des situations suivantes se produit:

  • Le premier argument est null ou est une chaîne de longueur zéro. FAUX: "howareyou" n'est pas null et plus de 0 longueur
  • Le radix est soit plus petit que Character.MIN_RADIX ou plus grand que Character.MAX_RADIX. FAUX: 35 est dans la plage [2,36]
  • Tout caractère de la chaîne n'est pas un chiffre du radix spécifié, sauf que le premier caractère peut être un signe moins '-' ('\ u002D') ou un signe plus '+' ('\ u002B') à condition que la chaîne soit plus long que la longueur 1. FAUX: tous les caractères de "howareyou" sont dans la plage radix [0, 'y']
  • ==> La valeur représentée par la chaîne n'est pas une valeur de type int. TRUE: la raison de l'exception. La valeur est trop grande pour un int.

Long ou BigInteger doit être utilisé

5
Glenn Teitelbaum

Se pourrait-il que le nombre soit> Integer.MAX_VALUE? Si j'essaye votre code avec Long à la place, cela fonctionne.

5
Blub

Le nombre devient plus grand que Integer.MAX_VALUE

Essaye ça:

System.out.println(Integer.parseInt("yellow", 35));
System.out.println(Long.parseLong("howareyou", 35));

Comme on le voit dans les commentaires de René Link, vous recherchez quelque chose comme ça en utilisant un BigInteger :

BigInteger big=new BigInteger("abcdefghijklmno", 25);

Quelque chose comme ça:

System.out.println(Long.MAX_VALUE);
System.out.println(new BigInteger("abcdefghijklmno",25));
5
Rahul Tripathi

Les réponses précédentes de parseLong seraient correctes, mais parfois elles ne sont pas assez grandes donc l'autre option consisterait à utiliser un BigInteger.

Long.parseLong("howareyou", 35)
new BigInteger("howareyou", 35)
2
Joe

Comme vous pouvez le voir, vous manquez d'espace dans votre Integer. En le remplaçant par un Long, vous obtenez le résultat souhaité. Voici le lien IDEOne vers le code de travail .

Code

System.out.println(Integer.parseInt("YELLOW",35));
System.out.println(Long.parseLong("HOWAREYOU",35));
2
christopher

Le nombre produit est trop grand pour un Java Entier, utilisez un Long.

2
Bob Flannigon