Ich habe eine Konvertierung zum Map-Problem in Core Java.
Unten ist Voraussetzung:
Gegeben ein String-Array unterhalb von
Konvertiere es in eine Map, so dass die resultierende Ausgabe unter
liegtAusgabe
%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%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.
Integer.parseInt(..)
löst eine Ausnahme für ungültige Eingaben aus.
Ihre if
-Klausel sollte wie folgt aussehen:
Wo isNumber
mehrfach implementiert werden kann. Zum Beispiel:
try { Integer.parseInt(..) } catch (NumberFormatException ex)
(siehe diese verwandte Frage) NumberUtils.isNumber(..)
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% 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
Sie müssen einen try / catch-Block verwenden, anstatt den Rückgabewert für parseInt zu testen.
%Vor%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.
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:
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?
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%