Frage

Ich laufe in dieser Situation, wo ich brauche eine String in eine int zu analysieren, und ich weiß nicht, was mit dem NumberFormatException zu tun. Der Compiler beschwert sich nicht, wenn ich es nicht fangen, aber ich möchte nur sicherstellen, dass ich diese Situation richtig bin Handhabung.

private int getCurrentPieceAsInt() {
    int i = 0;
    try {
        i = Integer.parseInt(this.getCurrentPiece());
    } catch (NumberFormatException e) {
        i = 0;
    }
    return i;
}

Ich möchte nur mein Code wie folgt vereinfachen. Der Compiler hat kein Problem mit ihm, aber die Gewindewerkzeug auf dem NumberFormatException.

private int getCurrentPieceAsInt() {
    int i = 0;
    i = Integer.parseInt(this.getCurrentPiece());
    return i;
}

Google CodePro will, dass ich die Ausnahme in irgendeiner Weise protokollieren, und ich stimme zu, dass dies am besten Praxis ist.

private int getCurrentPieceAsInt() {
    int i = 0;
    try {
        i = Integer.parseInt(this.getCurrentPiece());
    } catch (NumberFormatException e) {
        i = 0;
        e.printStackTrace();
    }
    return i;
}

Ich möchte diese Methode 0 zurückzukehren, wenn das aktuelle Stück nicht eine Zahl ist oder nicht analysiert werden können. Wenn ich ausdrücklich nicht die NumberFormatException fangen, ist es nicht die Variable i zuweisen? Oder gibt es einige Standardwerte, dass Integer.parseInt() kehrt?

Allgemein Stil sagt, dass, wenn ich eine Ausnahme zu fangen, sollte ich es irgendwo anmelden. Ich will es nicht loggt sein. Es ist normal Betrieb für diese Ausnahme manchmal geworfen werden, die auch bei mir nicht gut sitzen. Ich kann keine Funktion, jedoch finden, die mir sagen, wenn Integer.parseInt() wird eine Ausnahme werfen. So ist mein einziger Handlungs nur zu sein scheint, es zu nennen und die Ausnahme abfangen.

Die javadoc für parseInt hilft nicht viel.

Hier sind die spezifischen Fragen, die ich wissen möchte:

  • Gibt es eine Methode, dass ich anrufen kann, dass wird mir sagen, ob Integer.parseInt() ein NumberFormatException es vor dem Aufruf werfen? Dann würde ich keine Probleme bei der Anmeldung diese hat, da es sollte nie passieren.
  • Wenn ich einfach nicht die Ausnahme fangen, wird der valiable nicht zugeordnet werden? Dann werde ich einfach initialisieren es auf den Wert, dass ich will, wenn es keine Zahl und nicht die Ausnahme abfangen.
  • Gibt es eine Möglichkeit, die Ausnahme zu markieren irgendwie ausdrücklich, dass ich nicht darüber egal? Ich denke, das ist etwas ähnlich wie AWTEvent.consume() wäre. Wenn ja, dann werde ich dies tun, so dass Google CodePro sieht dies nicht als „unlogged“.
War es hilfreich?

Lösung

  • Gibt es eine Methode, dass ich anrufen kann, dass mir sagen, wenn Integer.parseInt () eine Number werfen, bevor es nennen? Dann würde ich keine Probleme bei der Anmeldung diese hat, da es sollte nie passieren.

Leider nein. Zumindest nicht in dem Kern Java API. Es ist leicht, aber zu schreiben -. Nur den Code ändern

  • Wenn ich einfach nicht die Ausnahme fangen, wird der valiable nicht zugeordnet werden? Dann werde ich einfach initialisieren es auf den Wert, dass ich will, wenn es keine Zahl und nicht die Ausnahme abfangen.

Wenn Sie nicht die Ausnahme fangen dann der Stapel entspannen wird, bis er einen catch-Block trifft, die damit umgehen, oder es wird entspannen vollständig und den Faden zu stoppen. Die Variable wird in der Tat nicht zugeordnet werden, aber das ist nicht genau das, was Sie wollen.

  • Gibt es eine Möglichkeit, die Ausnahme zu markieren irgendwie ausdrücklich, dass ich nicht darüber egal? Ich denke, das wäre etwas, ähnlich wie AWTEvent.consume (). Wenn ja, dann werde ich dies tun, so dass Google CodePro sieht dies nicht als „unlogged“.

Es kann ein Weg sein, CodePro zu sagen, diese besondere Warnung zu ignorieren. Sicherlich mit Werkzeugen wie FindBugs und Check Sie können Warnungen an bestimmten Orten auszuschalten. (EDIT:. @Andy hat darauf hingewiesen, wie dies zu tun)

Ich vermute, was Sie wollen, ist so etwas wie die Commons lang Paket von @daveb erwähnt. Es ist ziemlich einfach eine solche Funktion zu schreiben:

int parseWithDefault(String s, int def) {
    try {
        return Integer.parseInt(s);
    }
    catch (NumberFormatException e) {
        // It's OK to ignore "e" here because returning a default value is the documented behaviour on invalid input.
        return def;
    }
}

Andere Tipps

Es gibt NumberUtils.toInt (String, int) in commons lang , die genau das tun, was Sie wollen.

NumberUtils.toInt("123", 42) ==> 123
NumberUtils.toInt("abc", 42) ==> 42
* Is there a way to mark the exception somehow explicitly that I don't care about it? I'm thinking this would be something similar to AWTEvent.consume(). If so, then I will do this so that Google CodePro doesn't see this as "unlogged".

Ja, können Sie lokal deaktivieren Sie eine CodePro Überwachungsregel für eine Codezeile:

http://code.google.com/javadevtools/ CodePro / doc / features / audit / locally_disabling_audit_rules.html

sagte, ist es nicht unbedingt erforderlich, die Diagnoseprotokollierung in jedem Ausnahme catch-Block enthalten. Manchmal ist die beste Aktion einen Standardkurs. Irgendwann ist es mit dem Benutzer zu interagieren. Es hängt davon ab.

Starten Sie Ihre eigene bequeme Methode für jetzt und die zukünftige Verwendung:

public static int parseInt(final /*@Nullable*/ String s, final int valueIfInvalid) {
    try {
        if (s == null) {
            return valueIfInvalid;
        } else {
            return Integer.parseInt(s);
        }
    } catch (final NumberFormatException ex) {
        return valueIfInvalid;
    }
}

Gibt es eine Methode, dass ich anrufen kann, dass mir sagen, wenn Integer.parseInt () eine Number werfen, bevor es nennen? Dann würde ich keine Probleme bei der Anmeldung diese hat, da es sollte nie passieren.

Nicht, dass ich wüsste. Beachten Sie, dass wenn es, Sie wahrscheinlich den Wert zweimal Parsen am Ende (einmal zu bestätigen und, sobald es zu analysieren). Ich verstehe Sie wollen die Ausnahme vermeiden, aber in diesem Fall ist dies die Ausnahme ist ansteckend ist das Standard-Idiom in Java und es ist eine andere nicht bieten (zumindest soweit ich weiß).

Wenn ich einfach nicht die Ausnahme fangen, wird der valiable nicht zugeordnet werden? Dann werde ich einfach initialisieren es auf den Wert, dass ich will, wenn es keine Zahl und nicht die Ausnahme abfangen.

Sie müssen die Ausnahme abfangen (auch wenn es nichts tut) oder es wird der Block entkommen und durch den Stapel werfen.

Gibt es eine Möglichkeit, die Ausnahme zu markieren irgendwie ausdrücklich, dass ich nicht darüber egal? Ich denke, das wäre etwas, ähnlich wie AWTEvent.consume (). Wenn ja, dann werde ich dies tun, so dass Google CodePro sieht dies nicht als „unlogged“.

Ich weiß nicht jeder. Ich würde die oben bequeme Methode verwenden (Ich habe etwas Ähnliches in einer kleinen Sammlung von allgemeinen Dienstprogramme ich für meine alle Projekte zur Verfügung haben).

würde ich log es nicht, wenn seine wirklich ein normaler Zustand, dass Sie Handhabung. Ich bin nicht familiiar mit Google CodePro, aber ich würde hoffen, dass es eine Möglichkeit ist, um die Warnung zu unterdrücken, z.B. eine Art von @SuppressWarnings ( "xxx") Anmerkung / keyword.


Edit: Ich wollte diese Kommentare in den Kommentaren darauf hinzuweisen, unter

Dieser Ansatz funktioniert immer noch nicht die Ausnahme behandeln. Es ist schlechter Stil, eine Ausnahme zu fangen und nichts zu tun mit ihm. Das ist, warum ich für eine bessere Lösung suchen

.

... Die Ausnahme (die Situation) behandelt wird durch die Rückkehr angegeben valueIfInvalid. Die „schlechte Form“ Sie beziehen sich auf die schlechte Praxis blind und gedankenlos leere catch-Blöcke schreiben und nie wirklich zu prüfen, und die Adresse zurück der Fall. Wenn die Ausnahmesituation betrachtet und das Richtige tut für die Situation ( auch wenn das Richtige ist, nichts zu tun ), dann Sie haben „behandelt“ die Ausnahme .

Sie sollten die Exception fangen, wie Sie tun. Es ist ärgerlich, aber der beste Ansatz.

Es gibt keine Java-API-Methode, die 0 zurück, wenn die Zeichenfolge keine gültige int ist.

Wenn die Zeichenfolge nicht ein int ist, wird eine Ausnahme ausgelöst werden, um Ihre int Variable nicht gesetzt werden, wenn Sie die Ausnahme fangen, wie Sie tun.

Wenn es nicht klar, wie man es aus dem Getter behandeln sollte, sollten Sie sie nicht fangen und die Anrufer mit ihr umgehen, anstatt lassen. Wenn Sie wissen, wie es sollte, dass du das nur tun, behandelt werden. Anmelden kann es nicht erforderlich oder sehr nützlich in diesem Fall.

Logging eine Ausnahme ist nützlich, wenn Sie nicht wissen, wie die Ausnahme zu behandeln und Sie es auf die Person verlassen die Protokolle zu lesen.

Ihr erster Codeblock korrekt ist. i nicht implizit auf 0 umgewandelt werden, wenn eine Ausnahme auftritt, und Sie müssen diese Ausnahme fangen. Einstellen i auf 0 innerhalb catch korrekt ist; obwohl Sie können einfach i = 0; mit return 0; ersetzen. Sie können nicht vermeiden Ausnahme in diesem Fall der Handhabung.

Um zu klären, können Sie diese verwenden:

private int getCurrentPieceAsInt() {
    int i = 0;
    try {
        i = Integer.parseInt(this.getCurrentPiece());
    } catch (NumberFormatException e) {
        // log that an exception occured if it's needed
        return 0;
    }
    return i;
}

Wie andere erwähnt haben, gibt es nicht einen eingebauten in Kern Java API-Methode können Sie rufen eine ganze Zahl zu bestätigen, aber Sie die Character-Klasse verwenden, können Sie Ihre Eingabe ohne mit Ausnahmebehandlung zu validieren. Zum Beispiel:

package com.example.parseint;

public class ValidateIntExample {
    public static boolean isInteger(String s) {
        if (s == null) {
            return false;
        }

        s = s.trim();

        if (s.length() == 0) {
            return false;
        }

        int start = 0;
        if (s.charAt(0) == '-') { // handle negative numbers
            if (s.length() == 1) {
                return false;
            }
            else {
                start = 1;
            }
        }

        for (int i = start; i < s.length(); i++) {
            if (! Character.isDigit(s.charAt(i))) {
                return false;
            }
        }

        return true;
    }
}

In der Tat parseInt selbst verwendet Character.isDigit intern, die Sie in dem JRE-Quellcode überprüfen können. (Sorry, ich habe die parseInt Methode hier enthalten ist, aber ich bin nicht sicher, ob ich unter den Lizenzbedingungen erlaubt werde.) Wenn Sie Eclipse-verwenden und Sie haben das JRE-Quellcode zu einem Projekt angeschlossen ist, können Sie mit dem rechten -Klick auf der Methode Integer.parseInt in Ihrem Code und klicken Sie auf Öffnen Erklärung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top