予想される場合、numberformatexceptionを処理する適切な方法は何ですか?
-
08-10-2019 - |
質問
私はこの状況に出くわします。 String
に int
そして、私は何をすべきかわかりません NumberFormatException
. 。コンパイラは、私がそれをキャッチしないときに文句を言いませんが、私はこの状況を適切に処理していることを確認したいだけです。
private int getCurrentPieceAsInt() {
int i = 0;
try {
i = Integer.parseInt(this.getCurrentPiece());
} catch (NumberFormatException e) {
i = 0;
}
return i;
}
このようにコードを簡素化したいだけです。コンパイラには問題がありませんが、スレッドは NumberFormatException
.
private int getCurrentPieceAsInt() {
int i = 0;
i = Integer.parseInt(this.getCurrentPiece());
return i;
}
Google Codeproは、私に例外を何らかの形で記録することを望んでいます。これはベストプラクティスであることに同意します。
private int getCurrentPieceAsInt() {
int i = 0;
try {
i = Integer.parseInt(this.getCurrentPiece());
} catch (NumberFormatException e) {
i = 0;
e.printStackTrace();
}
return i;
}
この方法を返したいです 0
現在のピースが数字ではない場合、または解析できない場合。私が捕まえないとき NumberFormatException
明示的に、変数を割り当てませんか i
?または、デフォルト値があります Integer.parseInt()
戻り値?
一般的なスタイルによれば、例外をキャッチした場合、どこかにログインする必要があります。私はそれを記録したくありません。この例外を時々投げるのは通常の操作であり、私と一緒にもうまくいきません。しかし、私は関数を見つけることができません、それは私に教えてくれます Integer.parseInt()
例外をスローします。ですから、私の唯一の行動方針は、それを呼び出して例外をキャッチすることです。
Javadoc にとって parseInt
あまり役に立ちません。
ここに私が知りたい具体的な質問があります:
- 私が呼ぶことができる方法はありますか
Integer.parseInt()
スローしますNumberFormatException
それを呼ぶ前に?それから、これをログするのに問題はありません。 - 単に例外をキャッチしない場合、Valiableは割り当てられませんか?次に、それが数字ではなく、例外をキャッチしないときに必要な価値に単純に初期化します。
- 例外を何らかの形で明確にマークする方法はありますか?私はこれが似ていると思っています
AWTEvent.consume()
. 。もしそうなら、Google Codeproがこれを「非ログ」と見なさないように、これを行います。
解決
- integer.parseint()が呼び出す前にnumberformatexceptionをスローするかどうかを教えてくれると呼ぶことができる方法はありますか?それから、これをログするのに問題はありません。
悲しいことに、いいえ。少なくともコアJava APIではそうではありません。ただし、書くのは簡単です。以下のコードを変更するだけです。
- 単に例外をキャッチしない場合、Valiableは割り当てられませんか?次に、それが数字ではなく、例外をキャッチしないときに必要な価値に単純に初期化します。
例外をキャッチしないと、スタックがそれを処理するキャッチブロックにヒットするか、完全にくつろぎ、スレッドを停止するまで、スタックがくつろいでいます。実際、変数は割り当てられませんが、これはまさにあなたが望むものではありません。
- 例外を何らかの形で明確にマークする方法はありますか?これはawtevent.consume()に似ていると思います。もしそうなら、Google Codeproがこれを「非ログ」と見なさないように、これを行います。
この特定の警告を無視するようにCodeproに伝える方法があるかもしれません。確かに、FindBugsやCheckStyleなどのツールを使用すると、特定の場所で警告をオフにすることができます。 (編集:@andyはこれを行う方法を指摘しました。)
あなたが望むのは、@davebが言及したCommons Langパッケージのようなものだと思います。そのような機能を書くのは非常に簡単です:
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;
}
}
他のヒント
がある numberutils.toint(string、int) の コモンズラング それはあなたが望むことを正確に行います。
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".
はい、1行のコードのCodePro監査ルールをローカルに無効にすることができます。
http://code.google.com/javadevtools/codepro/doc/features/audit/locally_disabling_audit_rules.html
とはいえ、すべての例外キャッチブロックに診断ログを含める必要はありません。時には、最良のアクションはデフォルトのコースを受講することです。いつかユーザーとやり取りすることです。場合によります。
今のところ、独自の便利な方法と将来の使用を作成します。
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;
}
}
integer.parseint()が呼び出す前にnumberformatexceptionをスローするかどうかを教えてくれると呼ぶことができる方法はありますか?それから、これをログするのに問題はありません。
私が知っているわけではありません。あれば、値を2回解析することになる可能性が高いことに注意してください(1回検証し、1回はそれを解析するために1回)。私はあなたが例外を避けたいと思っていますが、この場合、これは例外がJavaの標準的なイディオムであり、それは別のものを提供しません(少なくとも私が知っていることはありません)。
単に例外をキャッチしない場合、Valiableは割り当てられませんか?次に、それが数字ではなく、例外をキャッチしないときに必要な価値に単純に初期化します。
例外をキャッチする必要があります(たとえ何もしない場合でも)、またはブロックから脱出してスタックを通り抜ける必要があります。
例外を何らかの形で明確にマークする方法はありますか?これはawtevent.consume()に似ていると思います。もしそうなら、Google Codeproがこれを「非ログ」と見なさないように、これを行います。
私は何も知りません。上記の便利な方法を使用します(すべてのプロジェクトで使用できる一般ユーティリティの小さなコレクションに似たものがあります)。
あなたが扱っているのが本当に通常の状態であれば、私はそれを記録しません。私はGoogle Codeproとの家族ではありませんが、警告を抑制する方法があることを願っています。
編集: 以下のコメントでこれらのコメントを指摘したかった
このアプローチはまだ例外を処理しません。例外をキャッチし、それを何もしないのは悪い形です。これが私がより良い解決策を探している理由です
.
...例外(状況) 処理されています 指定されたvalueifinvalidを返すことにより。 「悪い形」 あなたはに言及しています 盲目的かつ考えられないように空のキャッチブロックを書くという貧弱な練習 そして、本当に事件を考慮して対処するために戻ってはいけません。場合 例外の状況が考慮され、正しいことをします 状況のために正しいことが何もしないことであっても)、 それから 例外を「処理」しました.
あなたがしているときに例外をキャッチする必要があります。それは迷惑ですが、最良のアプローチです。
文字列が有効なINTではない場合に0を返すJava APIメソッドはありません。
文字列がINTでない場合、例外がスローされるため、INT変数が設定されないように設定されないように設定されません。
ゲッターからどのように処理するかが明確でない場合は、それをキャッチして、代わりに発信者に対処させるべきではありません。どのように処理すべきかを知っているなら、それをするべきです。この場合、記録する必要がないか、非常に役立つ場合があります。
例外を記録することは、例外を処理する方法がわからなく、ログを読んでいる人に任せている場合、より便利です。
最初のコードブロックは正しいです。 i
例外が発生した場合、暗黙的に0に変換されず、その例外をキャッチする必要があります。設定 i
内側に0に catch
正しい;ただし、単に交換できます i = 0;
と return 0;
. 。この場合、例外処理を避けることはできません。
明確にするには、これを使用できます。
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;
}
他の人が述べたように、整数を検証するために呼び出すことができる組み込みのコアJava APIメソッドはありませんが、使用できます Character
入力を検証するクラス それなし 例外処理を使用します。例えば:
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;
}
}
実際には、 parseInt
それ自体が使用します Character.isDigit
内部的には、JREソースコードで確認できます。 (申し訳ありませんが、私は含めていただろう parseInt
ここでの方法ですが、ライセンス条件の下で許可されているかどうかはわかりません。)Eclipseを使用していて、プロジェクトにJREソースコードが添付されている場合は、メソッドを右クリックすることができます。 Integer.parseInt
コードで[宣言を開く]をクリックします。