Domanda

Io corro in questa situazione in cui ho bisogno di analizzare un String in un int e non so cosa fare con il NumberFormatException. Il compilatore non si lamenta quando non prenderlo, ma voglio solo fare in modo che sto gestire questa situazione in modo corretto.

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

Voglio semplificare solo il mio codice come questo. Il compilatore non ha un problema con esso, ma gli stampi filettati su un NumberFormatException.

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

Google CodePro mi vuole accedere l'eccezione, in qualche modo, e sono d'accordo che questo è delle migliori pratiche.

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

Voglio che questo metodo restituisca 0 quando il pezzo corrente non è un numero o non può essere analizzato. Quando non prendo il NumberFormatException esplicitamente, non non assegnare il i variabili? O c'è qualche valore di default che i rendimenti Integer.parseInt()?

stile

Generale dice che se mi cattura un'eccezione, dovrei registrare da qualche parte. Non voglio per accedere esso. E 'il normale funzionamento per questa generazione di un'eccezione a volte, che inoltre non mi sta bene. Non riesco a trovare una funzione, però, che mi dirà se Integer.parseInt() un'eccezione. Quindi il mio unico corso di azione sembra essere per lo chiamano semplicemente e intercettare l'eccezione.

Il javadoc per parseInt non aiuta molto.

Ecco le domande specifiche che mi piacerebbe sapere:

  • Esiste un metodo che posso chiamare che mi dirà se Integer.parseInt() lancerà una NumberFormatException prima di chiamare? Allora non avrei alcun problema di accesso questo, dal momento che non dovrebbe mai accadere.
  • Se io semplicemente non intercettare l'eccezione, sarà la valiable non vengono assegnati? Allora io semplicemente inizializzare al valore che voglio quando non è un numero e non cattura l'eccezione.
  • C'è un modo per marcare l'eccezione in qualche modo esplicitamente che non mi interessa a questo proposito? Sto pensando che questo sarebbe qualcosa di simile a AWTEvent.consume(). Se è così, allora io farò in modo che Google CodePro non vede questo come "unlogged".
È stato utile?

Soluzione

  • Esiste un metodo che posso chiamare che mi dirà se Integer.parseInt () lancerà una NumberFormatException prima di chiamare? Allora non avrei alcun problema di accesso questo, dal momento che non dovrebbe mai accadere.

Purtroppo, no. A non almeno nel nucleo API Java. E 'facile scrivere uno, tuttavia -. Basta modificare il codice seguente

  • Se io semplicemente non intercettare l'eccezione, sarà la valiable non vengono assegnati? Allora io semplicemente inizializzare al valore che voglio quando non è un numero e non cattura l'eccezione.

Se non si cattura l'eccezione quindi lo stack rilassarsi fino a quando non colpisce un blocco catch che gestirà esso, o sarà rilassarsi completamente e fermare il filo. La variabile sarà, infatti, non essere assegnato, ma questo non è esattamente quello che vuoi.

  • C'è un modo per marcare l'eccezione in qualche modo esplicitamente che non mi interessa a questo proposito? Sto pensando che questo sarebbe qualcosa di simile a AWTEvent.consume (). Se è così, allora io farò in modo che Google CodePro non vede questo come "unlogged".

Non ci può essere un modo per dire CodePro di ignorare questo particolare allarme. Certamente con strumenti come FindBugs e Checkstyle è possibile disattivare gli avvisi in luoghi specifici. (EDIT:. @Andy ha sottolineato come farlo)

Ho il sospetto che quello che vuoi è qualcosa di simile al pacchetto di Commons Lang menzionato da @daveb. E 'abbastanza facile scrivere tale funzione una:

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;
    }
}

Altri suggerimenti

C'è NumberUtils.toInt (String, int) in Commons Lang che farà esattamente quello che vuoi.

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".

Sì, è possibile localmente disattivare una regola di controllo CodePro per una riga di codice:

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

Detto questo, non deve necessariamente includere la registrazione diagnostica in ogni blocco di eccezioni cattura. A volte, l'azione migliore è quello di seguire un corso di default. A volte è di interagire con l'utente. Dipende.

Crea il tuo metodo di convenienza per la società e l'utilizzo futuro:

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;
    }
}
  

C'è un metodo che posso chiamare che mi dirà se Integer.parseInt () lancerà una NumberFormatException prima di chiamare? Allora non avrei alcun problema di accesso questo, dal momento che non dovrebbe mai accadere.

Non che io sappia. Tenete a mente che se ci fosse, è probabile che finisce per l'analisi del valore di due volte (una volta per convalidare e una volta di analizzare esso). Capisco si vuole evitare l'eccezione, ma in questo caso, questo sta recuperando l'eccezione è l'idioma standard Java e non fornisce un altro (almeno che io sappia).

  

Se io semplicemente non intercettare l'eccezione, sarà la valiable non vengono assegnati? Allora io semplicemente inizializzare al valore che voglio quando non è un numero e non cattura l'eccezione.

È necessario intercettare l'eccezione (anche se non fa niente) o sarà sfuggire al blocco e gettare attraverso la pila.

  

C'è un modo per marcare l'eccezione in qualche modo esplicitamente che non mi interessa a questo proposito? Sto pensando che questo sarebbe qualcosa di simile a AWTEvent.consume (). Se è così, allora io farò in modo che Google CodePro non vede questo come "unlogged".

Non so di qualsiasi. Vorrei utilizzare il metodo comodo sopra (io ho qualcosa di simile in una piccola collezione di utilità generale che ho a disposizione per l'uso su tutti i miei progetti).

Non sarebbe il login, se la sua veramente una condizione normale che si sta gestendo. Io non sono familiiar con Google CodePro, ma mi auguro ci sia un modo per eliminare l'avviso, ad esempio, una sorta di @SuppressWarnings ( "xxx") annotazione / parola chiave.


Modifica: Ho voluto sottolineare questi commenti nei commenti qui sotto

  

Questo approccio ancora non gestisce l'eccezione. E 'cattiva forma per intercettare un'eccezione e non fare nulla con esso. Questo è il motivo per cui sto cercando una soluzione migliore

.

  

... L'eccezione (la situazione) viene gestita restituendo il indicato valueIfInvalid. Il "cattiva forma" si fa riferimento alla scarsa pratica di ciecamente e senza riflettere a scrivere blocchi catch vuoti e mai tornare a considerare e affrontare veramente il caso. Se il situazione eccezione è considerato e fa la cosa giusta per la situazione ( anche se la cosa giusta è quella di non fare nulla ), quindi Hai "gestito" l'eccezione .

Si dovrebbe intercettare l'eccezione, come si sta facendo. E 'fastidioso, ma l'approccio migliore.

Non esiste un metodo API Java che restituirà 0 se la stringa non è un int valido.

Quando la corda non è un int, un'eccezione verrà generata in modo la variabile int non sarà impostata a meno che non si cattura l'eccezione, come si sta facendo.

Se la sua non è chiaro come si dovrebbe gestire la cosa dal getter, non si dovrebbe prendere e lasciare che l'affare chiamante con esso, invece. Se si sa come dovrebbe essere gestito si dovrebbe fare solo quello. Registrazione può non essere necessaria o molto utile in questo caso.

Logging un'eccezione è più utile se non si sa come gestire l'eccezione e si sta lasciando alla persona che legge i registri.

Il primo blocco di codice è corretto. i non sarà implicitamente convertito a 0 quando si verifica un'eccezione e si deve prendere tale eccezione. Impostazione i a 0 catch all'interno è corretta; anche se è possibile sostituire semplicemente i = 0; con return 0;. Non si può evitare la gestione delle eccezioni in questo caso.

Per chiarire, è possibile utilizzare questo:

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;
}

Come altri hanno detto, non v'è un built-in nucleo metodo API Java è possibile chiamare per convalidare un intero, ma è possibile utilizzare la classe Character per convalidare l'input senza utilizzando la gestione delle eccezioni. Ad esempio:

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 realtà, parseInt stesso utilizza Character.isDigit internamente, che è possibile verificare nel codice sorgente JRE. (Scusate, avrei incluso il metodo parseInt qui, ma non sono sicuro se mi è permesso sotto i termini della licenza.) Se si utilizza Eclipse e si ha il codice sorgente JRE collegato al progetto, è possibile a destra -clic sul metodo Integer.parseInt nel codice e fare clic su Apri Dichiarazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top