2013-11-26 17 views
21

Ich fühle mich wie ich einfach etwas fehlen muss, aber ich bin ein NumberFormatException auf dem folgenden Code erhalten:Integer.parseInt Nummer Format Ausnahme?

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

Ideone

Es kann den String konvertiert yellow von der Basis 35, I don‘ Ich verstehe, warum ich einen NumberFormatException auf diesem String bekommen würde.

+0

Aus der Dokumentation: „Analysiert den String-Argument als Ganzzahl mit Vorzeichen in der durch das zweite Argument angegeben radix Die Zeichen in der Zeichenfolge alle Ziffern der angegebenen radix sein muss (wie durch, ob Character.digit bestimmt (. char, int) gibt einen nicht negativen Wert zurück, mit der Ausnahme, dass das erste Zeichen ein ASCII-Minuszeichen '-' ('\ u002D') sein kann, um einen negativen Wert oder ein ASCII-Pluszeichen '+' ('\ u002B') anzugeben " – HectorLector

+2

Die erzeugte Zahl ist zu groß für eine Java Integer, verwenden Sie eine Long ... –

Antwort

29

Da das Ergebnis erhalten mehr als Integer.MAX_VALUE

Versuchen Sie, diese

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

und für

Long.parseLong("abcdefghijklmno",25) 

Sie benötigen BigInteger

die Sie interessieren, und Sie werden sehen, warum

+0

Dies scheint richtig zu sein. Ich habe jedoch ein neues Problem von 'Long.parseLong (" abcdefghijklmno ", 25) gefunden'. Irgendeine Idee, wie ich größere Zahlen analysieren kann, ist kein ParseBigDecimal? – Danny

+5

@Danny, Dafür brauchst du, BigInteger big = new BigInteger ("abcdefghijklmno", 25); ' – Masudul

5

Von dem JavaDocs:

Eine Ausnahme vom Typ NumberFormatException ausgelöst wird, wenn eine der folgenden Situationen eintritt:

  • Das erste Argument null oder ein String der Länge Null. FALSCH: „HowAreYou“ ist nicht null und über 0 Länge
  • Der Radix ist entweder kleiner als Character.MIN_RADIX oder größer als Character.MAX_RADIX. FALSE: 35 liegt im Bereich [2,36]
  • Jedes Zeichen der Zeichenfolge ist keine Ziffer der angegebenen Radix, außer dass das erste Zeichen ein Minuszeichen '-' ('\ u002D') oder sein kann Pluszeichen '+' ('\ u002B') vorgesehen ist, dass die Zeichenkette länger als die Länge 1. FALSE: Alle Zeichen "HowAreYou" in radix Bereich sind [0, 'y']
  • ==> Der von der Zeichenfolge dargestellte Wert ist kein Wert vom Typ int. WAHR: Der Grund für die Ausnahme. Der Wert ist zu groß für einen int.

Entweder Long oder BigInteger sollte

+1

Dies beantwortet die Frage nicht wirklich, Sie nur 4 Optionen dumpen, ohne klar zu machen, welche Einer ist die Ursache (und warum). –

+0

Shotgun Ansatz ist immer noch falsch hier. Es gibt eine und nur eine richtige Antwort. Nur weil du es mit 3 anderen hinzugefügt hast, die völlig falsch sind, macht deine Antwort nicht richtig. – dm78

+2

@DavidMays Die ersten waren offensichtlich falsch für mich - so zitieren die vollen Java-Dokumente sollte geholfen haben, wenn der OP Prozess der Beseitigung verwendet - aber für Klarheit jetzt bearbeitet –

5

Könnte es, dass die Zahl>Integer.MAX_VALUE sein verwendet werden? Wenn ich stattdessen Ihren Code mit versuche, funktioniert es.

2

Wie Sie sehen können, haben Sie in Ihrem Integer keinen Platz mehr. Indem Sie es für eine Long tauschen, erhalten Sie das gewünschte Ergebnis. Here is the IDEOne Link to the working code.

-Code

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

Die Zahl wird größer als Integer.MAX_VALUE

Try this:

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

Wie in René Verbindung gesehen Kommentare, die Sie suchen nach etwas, wie dies ein mit BigInteger:

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

Etwas wie folgt aus:

System.out.println(Long.MAX_VALUE); 
System.out.println(new BigInteger("abcdefghijklmno",25)); 
2

Die Zahl produziert ist zu groß für eine Java-Integer, eine lange verwenden.

2

Die vorherigen Antworten von parseLong wären korrekt, aber manchmal ist das auch nicht groß genug, also würde die andere Option einen BigInteger verwenden.

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