So prüfen Sie, ob eine Zeichenfolge eine Nummer ist [duplizieren]

7

Ich habe eine Konvertierung zum Map-Problem in Core Java.

Unten ist Voraussetzung:
Gegeben ein String-Array unterhalb von

%Vor%

Konvertiere es in eine Map, so dass die resultierende Ausgabe unter

liegt

Ausgabe

%Vor%

Das obige sollte für jedes Element im Array gedruckt werden. Ich habe den Code geschrieben, aber es funktioniert nicht und ich stecke fest. Bitte lassen Sie mich wissen, wie es gelöst werden kann. Danke im Voraus.

%Vor%

Ausnahme:

%Vor%     
Deepak 29.09.2011, 12:42
quelle

12 Antworten

7

Jeder schlägt vor, die Ausnahmebehandlung dafür zu benutzen, es gibt nichts Außergewöhnliches hier, um Ausnahmen wie diese zu rechtfertigen, du versuchst nicht, in deinem Auto nach links abzubiegen und wenn du abstürzt, gehst du richtig? So etwas sollte es tun

%Vor%

Viel klarer und effizienter ist es, dass das Werfen einer Ausnahme, selbst wenn 99% ganze Zahlen als Integerwert vorhanden sind, nicht einmal benötigt wird, so dass keine Konvertierung erforderlich ist.

    
vickirk 29.09.2011, 13:06
quelle
5

Integer.parseInt(..) löst eine Ausnahme für ungültige Eingaben aus.

Ihre if -Klausel sollte wie folgt aussehen:

%Vor%

Wo isNumber mehrfach implementiert werden kann. Zum Beispiel:

Bozho 29.09.2011 12:46
quelle
3

Sie überprüfen, ob parseInt gibt eine Zahl kleiner als 0 zurück, um festzustellen, ob die Eingabe nicht numerisch ist.

Diese Methode gibt jedoch überhaupt keinen Wert zurück, wenn die Eingabe nicht numerisch ist. Stattdessen löst es eine Ausnahme aus, wie Sie gesehen haben.

>

Der einfachste Weg zu tun, was Sie wollen, ist diese Ausnahme zu fangen und entsprechend zu handeln:

%Vor%     
Joachim Sauer 29.09.2011 12:48
quelle
3

Wenn Sie überprüfen möchten, ob die Zeichenkette eine gültige Java-Nummer ist, können Sie die Methode isNumber von org.apache.commons.lang.math verwenden (doc hier: Ссылка ).

Auf diese Weise müssen Sie nicht Ihre eigene Implementierung von isNumber

schreiben     
talnicolas 29.09.2011 12:50
quelle
1

Sie müssen einen try / catch-Block verwenden, anstatt den Rückgabewert für parseInt zu testen.

%Vor%     
Charles Goodwin 29.09.2011 12:47
quelle
1

Ihr Fehler tritt hier auf:

%Vor%

Integer.parseInt löst eine NumberFormatException aus, wenn die Eingabe keine Zahl ist. Daher müssen Sie einen try / catch-Block verwenden, zum Beispiel:

%Vor%     
spikeheap 29.09.2011 12:49
quelle
1

Angenommen, Sie verwenden keine externen Bibliotheken, können Sie dazu auch einen Regular Expression Matcher verwenden. Genau wie

%Vor%

Beachten Sie, dass dies nur mit nichtnegativen ganzen Zahlen funktioniert, Sie können jedoch den regulären Ausdruck so anpassen, dass er mit den Zahlenformaten übereinstimmt, die Sie als true zuordnen möchten. Wenn das Element null ist, erhalten Sie eine NullPointerException , daher ist hier ein kleiner defensiver Code erforderlich.

    
fernandohbc 29.09.2011 13:38
quelle
1

Hier ist eine verbesserte Antwort, die für Zahlen mit negativem Wert, Dezimalstellen usw. verwendet werden kann. Es verwendet Regular Expressions .

Hier ist es:

%Vor%     
Joe 30.09.2011 04:52
quelle
0

Ersetzen Sie Ihre parseInt-Zeile durch einen Aufruf von isInteger (str [i]), wobei isInteger definiert ist durch:

%Vor%     
Guillaume 29.09.2011 12:48
quelle
0

Ich möchte hier die gegenteilige Ansicht zu 'Keine Ausnahmebehandlung verwenden' eingeben. Der folgende Code:

%Vor%

entspricht vollständig:

%Vor%

außer im ersten Fall:

  1. Das Vorhandensein der Datei wird nur einmal überprüft
  2. Zwischen den beiden Überprüfungen gibt es kein Zeitfenster, in dem sich Dinge ändern können.
  3. Die Verarbeitung bei // ... wird nur einmal programmiert.

Sie sehen also keinen Code wie im zweiten Fall. Zumindest sollten Sie nicht.

Der vorliegende Fall ist identisch, außer dass es ein String gibt, gibt es kein Zeitfenster. Integer.parseInt() muss die Eingabe trotzdem auf Gültigkeit prüfen, und es wird eine Exception ausgelöst, die trotzdem irgendwo gefangen werden muss (außer Sie möchten, dass RTEs Ihre Threads stoppen). Warum also alles zweimal machen?

Das Gegenargument, dass Sie keine Ausnahmen für die normale Ablaufsteuerung verwenden sollten, wirft nur die Frage auf. Ist es normale Flusskontrolle? oder ist es ein Fehler in der Eingabe? [In der Tat habe ich dieses Prinzip immer verstanden, um genauer zu sagen: "Wirf keine Ausnahmen zu deinem eigenen Code" innerhalb der Methode, und selbst dann gibt es seltene Fälle, in denen es die beste Antwort ist. Ich bin kein Fan von Pauschalregeln jeglicher Art.]

Ein weiteres Beispiel, das EOF auf einem ObjectInputStream erkennt. Du machst es, indem du EOFException abfängst. Es gibt keinen anderen Weg, als dem Stream eine Zählung voran zu stellen, was eine Designänderung und eine Formatänderung ist. Also, ist EOF Teil des normalen Flusses, oder ist es eine Ausnahme? und wie kann Teil des normalen Ablaufs sein, da es nur über eine Ausnahme gemeldet wird?

    
EJP 30.09.2011 00:16
quelle
0

Hier ist eine allgemeinere Möglichkeit zu validieren, Ausnahmen zu vermeiden und zu verwenden, was die Format-Unterklassen bereits wissen. Zum Beispiel weiß das SimpleDateFormat, dass Feb 31 nicht gültig ist, solange Sie ihm sagen, dass nicht nachsichtig ist.

%Vor%     
R.D. Alkire 27.09.2013 20:47
quelle
-1
%Vor%     
Vaandu 29.09.2011 12:52
quelle

Tags und Links