Was ist eine NumberFormatException und wie kann ich sie beheben?

8
%Vor%

Meine While-Schleife:

%Vor%     
Qasim Imtiaz 04.10.2016, 10:31
quelle

9 Antworten

30
%Vor%

bedeutet:

%Vor%

Mit anderen Worten, Sie haben versucht, "Ace of Clubs" zu einem int zu parsen, was Java mit der Methode Integer.parseInt nicht tun kann. Java hat einen schönen Stacktrace bereitgestellt, der Ihnen genau sagt, was das Problem ist. Das Tool, nach dem Sie suchen, ist Debugger und mit Haltepunkten können Sie den Status Ihrer Anwendung zum ausgewählten Zeitpunkt prüfen.

Die Lösung könnte die folgende Logik sein, falls Sie parsen verwenden möchten:

%Vor%

Was ist ein Exception in Java?

  

Eine Ausnahme ist ein Ereignis, das während der Ausführung von a auftritt   Programm, das den normalen Ablauf der Programmanweisungen unterbricht.

- Dokumentation

Konstruktoren und Verwendung in Integer#parseInt

%Vor%

Sie sind wichtig, um zu verstehen, wie man den StackTrace liest. Schau, wie NumberFormatException von Integer#parseInt :

geworfen wird %Vor%

oder später, wenn das Format der Eingabe String s nicht analysierbar ist:

%Vor%

Was ist ein NumberFormatException ?

  

Wird ausgelöst, um anzuzeigen, dass die Anwendung versucht hat, eine Zeichenfolge in einen der numerischen Typen zu konvertieren, die Zeichenfolge jedoch nicht das entsprechende Format aufweist.

- Dokumentation

NumberFormatException extends IllegalArgumentException . Es sagt uns, dass es spezialisierter IllegalArgumentException ist. Tatsächlich wird hervorgehoben, dass der Argumenttyp korrekt war ( String ), der Inhalt von String jedoch nicht numerisch war ( a, b, c, d, e, f werden als Ziffern in HEX betrachtet) und sind bei Bedarf legal ).

Wie behebe ich es?
Nun, beheben Sie nicht die Tatsache, dass es geworfen wird. Es ist gut, dass es geworfen wird. Es gibt einige Dinge, die Sie beachten müssen:

  1. Kann ich den StackTrace lesen?
  2. Ist die String , die eine Exception a null verursacht?
  3. Sieht es wie eine Nummer aus?
  4. Ist es "meine Zeichenfolge" oder Benutzereingabe?
  5. wird fortgesetzt

Anzeige 1.

Die erste Zeile einer Nachricht ist eine Information, dass die Ausnahme aufgetreten ist und die Eingabe String , die das Problem verursacht hat. Der String folgt immer : und wird in Anführungszeichen gesetzt ( "some text" ). Dann sind Sie daran interessiert, den StackTrace vom Ende zu lesen, da die ersten Zeilen normalerweise der Konstruktor von NumberFormatException , die Parsing-Methode usw. sind. Am Ende steht dann Ihre Methode, in der Sie einen Fehler gemacht haben. Es wird darauf hingewiesen, in welcher Datei und in welcher Methode es aufgerufen wurde. Sogar eine Zeile wird angehängt. Du wirst sehen. Das Beispiel, wie man den StackTrace liest, ist oben.

Anzeige 2.

Wenn Sie sehen, dass anstelle von "For input string:" und der Eingabe null ( nicht "null" ) bedeutet, dass Sie versucht haben, die Nullreferenz an eine Zahl zu übergeben . Wenn Sie tatsächlich als 0 oder eine andere Zahl behandeln möchten, interessiert Sie möglicherweise mein anderer Beitrag auf StackOverflow. Es ist hier verfügbar.

Die Beschreibung zum Lösen von unerwarteten null s ist im StackOverflow-Thread gut beschrieben. Was ist eine NullPointerException und wie kann ich sie beheben? es? .

Anzeige 3.

Wenn die String , die auf : folgt und in Anführungszeichen steht, Ihrer Meinung nach wie eine Zahl ist, könnte es ein Zeichen geben, das Ihr System nicht dekodiert, oder ein unsichtbarer weißer Bereich. Offensichtlich kann " 6" nicht analysiert werden, ebenso wie "123 " nicht. Es ist wegen der Räume. Es kann jedoch vorkommen, dass String wie "6" aussieht, aber tatsächlich ist die Länge größer als die Anzahl der Stellen, die Sie sehen können.

In diesem Fall schlage ich vor, den Debugger oder mindestens System.out.println zu verwenden und die Länge des String , das Sie analysieren wollen, auszudrucken. Wenn mehr als die Anzahl der Ziffern angezeigt wird, übergeben Sie stringToParse.trim() an die Analysemethode. Wenn es nicht funktioniert, kopieren Sie die gesamte Zeichenfolge nach dem : und dekodieren Sie sie mit dem Online-Decoder. Es gibt Ihnen Codes aller Charaktere.

Es gibt auch einen Fall, den ich kürzlich auf StackOverflow gefunden habe, dass Sie vielleicht sehen, dass die Eingabe wie eine Zahl aussieht, z. "1.86" und es enthält nur diese 4 Zeichen, aber der Fehler ist immer noch vorhanden. Denken Sie daran, dass man ganze Zahlen nur mit # Integer # parseInt # analysieren kann. Zum Analysieren von Dezimalzahlen sollte man Double#parseDouble verwenden.

Anzeige 4.

Schließlich kommen wir zu der Stelle, an der wir uns einig sind, dass wir Situationen nicht vermeiden können, wenn der Benutzer "abc" als numerische Zeichenfolge eingibt. Warum? Weil er kann. In einem glücklichen Fall ist es, weil er ein Tester oder einfach ein Geek ist. In einem schlechten Fall ist es der Angreifer.

Was kann ich jetzt tun? Nun, Java gibt uns try-catch , was Sie tun können:

%Vor%     
xenteros 04.10.2016 10:38
quelle
9

Was ist ein NumberFormatException ?

  

Diese Ausnahme wird ausgelöst, um anzuzeigen, dass die Anwendung über die Anwendung verfügt   versucht, ein string in einen der numerischen Typen zu konvertieren, aber das   Das string hat nicht das passende Format.

In Ihrem Fall wurde diese Ausnahme gemäß Ihrer Stack-Ablaufverfolgung von Integer.parseInt(String) , was bedeutet, dass die angegebene String keine analysierbare integer enthält. Und immer noch gemäß der Stack-Ablaufverfolgung, ist es aufgrund der Tatsache, dass Sie versucht haben, das String " Kreuz Ace " als Ganzzahl zu analysieren, die nicht funktionieren kann, da es nicht die String -Darstellung ist einer Ganzzahl.

Wie man es repariert?

Der einfachste und generische Weg besteht darin, die Ausnahme NumberFormatException

abzufangen %Vor%

Es wird funktionieren, aber das Abfangen einer Ausnahme ist langsam, weil es den Call-Stack erstellen muss, um das Exception zu erstellen, was teuer ist. Wenn Sie es also vermeiden können, tun Sie es. Außerdem müssen Sie die Ausnahme richtig verwalten, was nicht immer offensichtlich ist.

Oder Sie könnten regular expression verwenden, um zuerst zu überprüfen, ob String matches mit einem Integer , aber es ist ziemlich fehleranfällig, da Sie leicht eine falsche regular expression verwenden könnten.

In Ihrem Fall sollte ein mehr OO-Ansatz verwendet werden, anstatt mit String zu arbeiten, zum Beispiel könnten Sie einen class oder einen enum verwenden, um Ihre Karten zu repräsentieren, anstatt simple String zu verwenden viel fehleranfälliger als Sie es bereits bemerkt haben.

Wenn Sie also eine dedizierte Klasse für Ihre Karte verwenden möchten, könnte Ihr Code lauten:

%Vor%

Für die Farbe und den Rang einer Karte können wir enum verwenden, da die Anzahl der vorhandenen Ränge und Farben begrenzt ist.

%Vor%

Dann wäre cards ein Array von Card anstelle eines Arrays von String und könnte als nächstes initialisiert werden:

%Vor%

Wenn Sie Ihr Kartenfeld mischen müssen, können Sie wie folgt vorgehen (bitte beachten Sie, dass wenn Sie% ce_de% der Karten anstelle eines Arrays verwenden, einfach List verwenden)

%Vor%

Dann können Sie direkt auf den Wert Ihrer Karte mit Collections.shuffle(list) zugreifen, ohne das Risiko einzugehen, eine Ausnahme zu erhalten (außer ein cards[index].getRank().getValue() , wenn Sie keinen richtigen Index verwenden).

    
Nicolas Filotto 12.10.2016 15:49
quelle
6

Sieht aus wie cards[] ist String Array und Sie versuchen Ace of Clubs zu Integer zu konvertieren.

%Vor%     
Vivek G 04.10.2016 10:37
quelle
2
%Vor%

tritt auf, wenn Sie versuchen, eine Eingabe zu parsen, die keine Zahlenfolge ist.

In Ihrem Fall versucht Ihr, eine Zeichenkette (die keine Nummer hat) als Integer zu analysieren. Wie es nicht möglich ist Ausnahme für NumberFormatException aufgetreten.

%Vor%     
Rajesh Gopu 19.10.2016 07:38
quelle
2

Eine NumberFormatException ist die Art, wie Java Ihnen sagen muss "Ich habe versucht, einen String in int zu konvertieren und ich konnte es nicht tun".

In Ihrem Exception-Trace können Sie

lesen %Vor%

Grundsätzlich heißt das, dass Sie in der Zeile 68 Ihres Codes die Methode Integer.parseInt aufrufen und "Ace of Clubs" als Parameter übergeben. Diese Methode erwartet einen ganzzahligen Wert, der als String dargestellt wird, z. "4", beschwert sich also Methode, eine NumberFormatException zu werfen, weil "Ace of Clubs" gar keine ganze Zahl scheint.

    
jmlotero 19.10.2016 09:06
quelle
1

Die allererste Sache, die mich für eine Schleife (kein Wortspiel beabsichtigt) warf war, dass Sie den Wert auf 1-13 begrenzt haben, wenn es 0-52 sein muss. Auch bei Ihrer Logik war der Wert immer höher. Ein besserer Ansatz ist mit einem Zahlengenerator. Hier ist mein Code mit einem Zahlengenerator (oder Java Random):

%Vor%

Was die NumberFormatException betrifft, glaube ich, dass Nicolas Filotto einen guten Job gemacht hat, dies zu erklären.

    
thekodester 18.10.2016 11:10
quelle
1

A NumberFormatException bedeutet, dass Integer.parseInt() die Zeichenfolge nicht in eine Zahl übersetzen konnte.

Ich würde eine von zwei Optionen vorschlagen:

  1. Kapseln als Name (String) / Wert (Int) Combo einkapseln. Verwenden Sie den Wert, um Vergleiche durchzuführen, und den Namen, um dem Benutzer Informationen zu präsentieren. Cards[] wird dann zu einer Liste von Karten, keine Zeichenfolgen.

  2. Parsen Sie die Strings selbst. Was vielleicht einfacher ist, da Sie es bereits mit den if(cards[index].startsWith("Ace")) { value = 1; } -Bits gemacht haben. Sie können diese in eine Funktion namens CardToInt() (oder was auch immer) verschieben und diese Funktion anstelle von Integer.parseInt() verwenden.

Andrew Tofelt 18.10.2016 20:59
quelle
1
%Vor%

Während Sie die obige Aussage schreiben, versuchen Sie "Ace of Clubs" als Zahl zu analysieren.

Sie können die folgende Methode verwenden, um zu testen, ob eine Zeichenfolge als Ganzzahl analysiert werden kann:

%Vor%

In Bezug auf Ihre Frage, was ist NumberFormatException: Es wird ausgelöst, um anzuzeigen, dass die Anwendung versucht hat, eine Zeichenfolge in einen der numerischen Typen zu konvertieren, die Zeichenfolge jedoch nicht das entsprechende Format aufweist. (ref - Ссылка )

    
roopaliv 19.10.2016 07:46
quelle
0

Die Ausnahme kommt in Ihrem Code, wo Sie die Zeichenfolge in eine Ganzzahl konvertieren:

%Vor%

Übergeben Sie einen String als "Ace of Clubs" , der nicht als Ganzzahl konvertiert werden kann. Daher wird eine Ausnahme für das Zahlenformat ausgelöst. Sie können verwenden,

%Vor%     
Anands23 18.10.2016 11:29
quelle