8

Integer クラスには、String を Integer に変換するメソッドが含まれています。

  1. Integer.parseInt(null);パラメーター: 文字列 戻り値: int なので、パラメーターが null の場合、このスロー NPE を期待していました

  2. Integer.valueOf(null);パラメータ: 文字列 戻り値: 整数なので、パラメータが null の場合、これは null を返すはずです。しかし、この前提条件は間違っていました。なぜこのような状況を処理できる方法がないのでしょうか?

4

4 に答える 4

11

nullは整数の有効な表現ではありません。Integer.parseInt()解析する文字列が整数の有効な表現である必要があります。

Integer.parseInt()

  public static int parseInt(String s, int radix)
440                 throws NumberFormatException
441     {
442         if (s == null) {
443             throw new NumberFormatException("null");
444         }

Integer.valueOf(str)] // Integer.parseInt(Str) を呼び出して Integer インスタンスを返します。

  public static Integer valueOf(String s) throws NumberFormatException
569     {
570         return new Integer(parseInt(s, 10));
571     }
于 2013-02-27T15:24:53.400 に答える
9

Integer を実装した Sun の人々 (long少し前に :)) は、そのメソッドを作成したとき、おそらくデータベースについて考えていませんでした。データベース データを扱う場合や、"不明" を null で明示的に表現しようとするまれなケースを除いて、null は通常、何かがひどく間違っている兆候です。一般に、問題が発生したらすぐに例外を発生させることをお勧めします。(フェイルファスト設計)

提供したメモリよりも長い文字列値が原因である C のセグメンテーション違反を探し出すのに時間を費やしたことがある場合 (プログラム コードまたは他のデータを上書きした場合)、それがどれほど悪いかについて非常によく理解しています。何かがうまくいかなかったときに失敗しないことです。

Java 1.0 の時代以来、Java でのデータベースとの対話は非常に一般的になっているため、これを処理する方法が必要であると提案するのは正しいかもしれません。Integer は最終クラスであるため、独自の Integer のようなクラスを作成すると、オートボクシングが失われるため、おそらくオラクルによる言語の変更が必要になります。

基本的に、あなたが観察したことは今のところそのままであり、誰かがあなたにお金を払ってそれを回避する必要があります:)

于 2013-02-27T15:40:07.797 に答える
3

@hudi、私は間違っているかもしれませんが、これはあなたが探しているものですか?

public Integer valueOf2( String inputString ) {
    return (inputString == null) ? null : Integer.parseInt(inputString);
}
于 2013-02-27T15:34:52.947 に答える
0

@hudi、これはどうですか?

IntegerConverter

使用したことはありませんが、変換エラーが発生した場合はデフォルト値を指定できるようです。このためだけにプロジェクトに別のjarファイルを含めるのは面倒です。何か標準があればいいのにと思います。

于 2013-02-27T15:53:03.500 に答える