0

以下は、他の誰かが書いたクラスです。

私が直面している問題は、parse methodwithnull as the rawStringに入ったときに を投げていることですNumberFormatException

だから私がやろうと思っていたのは、その NumberFormatException とset the value itself as null. それで、私がした方法は正しいですか?

public class ByteAttr {

    @JExType(sequence = 1)
    private Byte value;

    public static ByteAttr parse(String rawString) {
        ByteAttr attr = new ByteAttr();
        try {
            attr.setValue(Byte.valueOf(rawString));
        } catch (NumberFormatException nfEx) {
            attr.setValue(null);
        }
        return attr;
    }

    public Byte getValue() {
        return this.value;
    }

    public void setValue(Byte value) {
        this.value = value;
    }
}
4

4 に答える 4

6

正しいアプローチは、プログラムで何を達成したいかによって異なります。

  • ByteAttr.getValue()プログラムの後半でが戻ることが理にかなっている場合nullは、アプローチがうまくいく可能性があります。
  • ただし、 が解読不能な引数 ( を含む) で呼び出された場合、例外をスローする必要があるかどうかを検討する必要があります。別の方法として、 をキャッチして、プログラム内でセマンティックな意味を持つ別の例外をスローすることもできます。parsenullNumberFormatException
    public static ByteAttr parse(String rawString) は、BadAttributeException をスローします {
        ByteAttr attr = new ByteAttr();
        試す {
            attr.setValue(Byte.valueOf(rawString));
        } キャッチ (NumberFormatException nfEx) {
            新しい BadAttributeException(nfEx) をスローします。// 元の例外をラップする
        }
        属性を返します。
    }
  • もう 1 つの手法は、が判読parseできない場合にデフォルト値を渡すことです。rawString
    public static ByteAttr parse(String rawString, Byte defaultValue) {
        ByteAttr attr = new ByteAttr();
        試す {
            attr.setValue(Byte.valueOf(rawString));
        } キャッチ (NumberFormatException nfEx) {
            attr.setValue(デフォルト);
        }
        属性を返します。
    }
于 2012-11-13T02:49:04.413 に答える
2

次の 4 つのことを行う必要があります。

  1. メソッドを使用するコンテキストで、解析不能な数値文字列が何を意味するかを決定します。プログラムの内部の問題ですか?破損したファイルですか?ユーザーのタイプミス?問題はありませんが、その文字列は別の方法で処理する必要がありますか?
  2. それを考慮して、最適な方法を決定してください。ほとんどの場合、エラーが外部入力によってトリガーされた場合は、それを報告する必要があります。null を代入することは、それを処理する良い方法かもしれません。
  3. やると決めたことを文書化します。メソッドが何らかの特定の意味を持つ null を返す場合は、それをコメント (できれば Javadoc コメント) として書き留める必要があります。
  4. 決定を実行します。

考えられる原因を熟考せず、問題の適切な報告をせずに、ステップ 4 に飛びついたという印象を、おそらく不当に受けます。

于 2012-11-13T02:56:21.630 に答える
1

次のような条件で早期終了を追加できます。

if (rawString != null) {
    return attr; // or other value you prefer
}

parse メソッドの呼び出し元が null 値をテストしていることを確認し、その場合は parse を呼び出さないようにすることもできます。

于 2012-11-13T02:46:04.080 に答える
0

これは、アプリケーションでの null 値に対する許容度によって異なります。parse()ユーザーが null 文字列をメソッドに渡さないと予想される場合は、防御的な null チェックを実行して例外をスローする必要があります。

if (null == rawString) {
    throw new CustomException("rawString cannot be null");
}

NumberFormatException の catch ブロックにも同じことが当てはまります。ここでは、Byte 属性の値を暗黙のうちに null に設定するのではなく、適切なメッセージで例外をスローする必要があります。

しかし、null完全に受け入れられる場合は、防御的な null チェックを実行し、Byte 属性を null に設定する必要があります。NumberFormatException は確かに抑制されるべきではありません、IMHO。

于 2012-11-13T02:49:53.303 に答える