17

とりわけ、文字列を整数に変換する小さなメソッドがあります。文字列はメソッドのパラメーターであるため、その文字列が変換可能であることを確認したいと思います。だから私は、最も安全かつ/または最速の方法は何だろうと思っていました.


バージョン A : そのままにして、リスクを冒します (これは回避しようとしています)。

public static int stringToInt(String param) {
        return Integer.valueOf(param);
}

(速度に関しては、バージョンBとCではどのような違いがありますか?)


バージョン B : 例外をキャッチ

public static int stringToInt(String param) {
        try {
                return Integer.valueOf(param);
        } catch(NumberFormatException e) {
                return -1;
        }
}

バージョン C : 文字列の各文字をチェックして、数字かどうかを確認します

public static int stringToInt(String param) {
        for(char c : param.toCharArray()) {
                if(!Character.isDigit(c))
                        return -1;
        }
        return Integer.valueOf(param);
}

パラメータは正の数である必要があり、-1 は私の小さなプログラムの「エラー値」であると想定されていることに注意してください。つまり、3 つのバージョンのメソッドはすべて、私のプログラムでは完全に正常に機能します。

私はあなたが私に与えることができる他の提案に非常にオープンです.

よろしくお願いいたします。

4

6 に答える 6

12

Guava offers a utility method for this which returns null in case your String can't be parsed.

https://google.github.io/guava/releases/19.0/api/docs/com/google/common/primitives/Ints.html#tryParse(java.lang.String)

Integer result = Ints.tryParse("1");  //returns 1
Integer result = Ints.tryParse("-1"); //returns -1
Integer result = Ints.tryParse("a");  //returns null
于 2014-07-29T16:14:10.923 に答える
7

まず、version は防弾ではないことに注意してくださいC: 負の数を拒否し、大きすぎる数をキャッチしません。

バージョンBは問題ありませんが、呼び出し元はコーディング スタイルを変更する必要があります。エラーをキャッチして他のエラーと一緒に処理するのではなく、呼び出し元は-1常にチェックする必要があります。これは、複数の整数を読み取る状況では最適ではないかもしれませんが、エラー処理は、どの特定の整数が失敗したかに依存しません。さらに、API を使用する新しいコーダーは をチェックするのを忘れて-1、エラー コードを誤って使用する可能性があります。

そのため、私は最初のオプションにとどまります。バージョンを使用するコードはA、Java API を知っている人なら誰でもすぐに見慣れたものに見えるでしょう。関数内で何が起こるかを学ぶ必要はありません。

于 2013-06-04T00:44:03.323 に答える
2

-1 を返すのではなく、例外をスローするように変更された B が最良の選択になると思います。ユーザーに適切な応答を送信するために処理できるレベルまで例外をスローすることをお勧めします。-1 のような値を返すと、コード エラーが発生しやすくなります。別のプログラマーがあなたのメソッドを使用しており、彼/彼女はあなたのメソッドの署名を持っているだけだとします。そのため、署名からは、例外またはエラーのシナリオを処理するために何をコーディングする必要があるかが明確ではありません。ただし、例外をスローしてメソッド宣言に追加すると、他のプログラマーが必要な例外処理とともにメソッドを適切に使用できるようになります。私にとっては、これが最もよく見えます:

public static int stringToInt(String param) throws NumberFormatException {
        try {
                return Integer.valueOf(param);
        } catch(NumberFormatException e) {
               // return -1;
               throw e;
        }
}
于 2013-06-04T00:45:59.250 に答える